c – SFINAE尝试用bool给出了编译错误:“模板参数’T :: value’涉及模板参数”[复制]
作者:互联网
参见英文答案 > Why is it disallowed for partial specialization in a non-type argument to use nested template parameters 2个
我尝试使用bool实现SFINAE(与流行的void_trick不同):
template<typename T, bool = true>
struct Resolve
{
static const bool value = false;
};
template<typename T>
struct Resolve<T, T::my_value>
{
static const bool value = true;
};
目标是专门化,具有静态const bool my_value = true的类;在里面定义.如果定义为false或未定义,则不要将其专门化.即
struct B1 { // specialize Resolve for this case
static const bool my_value = true;
};
struct B2 { // don't specialize
static const bool my_value = false;
};
struct B3 {}; // don't specialize
在B1上应用上述技巧时,它会给出编译错误:
Resolve<B1>::value;
error: template argument ‘T::my_value’ involves template parameter(s)
我知道这可以通过其他方式实现.但是,我有兴趣知道,为什么它会在这里给出编译器错误并且可以在这段代码中解决它?
解决方法:
实际上,§14.5.4/ 9节禁止你所做的事情,
A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.
诀窍可能是使用第二个模板参数的类型,封装非类型值,如下所述:
template<bool b> struct booltype {};
template<typename T, typename B = booltype<true> >
struct Resolve
{
static const bool value = false;
};
template<typename T>
struct Resolve<T, booltype<T::my_value> >
{
static const bool value = true;
};
现在它compile fines.
标签:c,templates,compiler-errors,sfinae 来源: https://codeday.me/bug/20190927/1823608.html