SFINAE尝试使用bool给出了编译器错误:"模板参数'T :: value'涉及模板参数"

iam*_*ind 11 c++ templates compiler-errors sfinae

我尝试使用SFINAE bool(不像流行的void_ 技巧):

  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;
  };
Run Code Online (Sandbox Code Playgroud)

目标是专门化,在其中static 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
Run Code Online (Sandbox Code Playgroud)

在上面应用上述技巧B1时会出现编译错误:

Resolve<B1>::value;
Run Code Online (Sandbox Code Playgroud)

错误:模板参数'T :: my_value'涉及模板参数

我知道这可以通过其他方式实现.但是,我有兴趣知道,为什么它会在这里给出编译器错误并且可以在这段代码中解决它?

Naw*_*waz 25

实际上,§14.5.4/ 9节禁止你所做的事情,

除非参数表达式是简单标识符,否则部分专用的非类型参数表达式不应涉及部分特化的模板参数.

诀窍可能是使用第二个模板参数的类型,封装非类型值,如下所述:

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;
};
Run Code Online (Sandbox Code Playgroud)

现在它编译罚款.