是否存在允许在类外部定义
method1
的语法,或者这对 SFINAE 不友好?
#include <type_traits>
template <int TClass>
struct SampleClass {
// This definition compiles just fine
template <int TMethod = TClass>
typename std::enable_if<TMethod == 0, void>::type
method0() {}
// Declaration
template <int TMethod = TClass>
typename std::enable_if<TMethod == 1, void>::type
method1();
};
// This does not compile
template <int TClass>
template <int TMethod = TClass>
typename std::enable_if<TMethod == 1, void>::type
SampleClass<TClass>::method1() {}
int main() { return 0; }
使用GCC 10.2.1,错误:
foo.cpp:20:30: error: default argument for template parameter for class enclosing 'typename std::enable_if<(TMethod == 1), void>::type SampleClass<TClass>::method1()'
20 | SampleClass<TClass>::method1() {}
| ^
错误消息描述了问题:
foo.cpp:20:30: error: default argument for template parameter for class enclosing 'typename std::enable_if<(TMethod == 1), void>::type SampleClass<TClass>::method1()' 20 | SampleClass<TClass>::method1() {} |
问题在于默认参数。
template <int TClass>
template <int TMethod /* = TClass*/>
typename std::enable_if<TMethod == 1, void>::type
SampleClass<TClass>::method1() {}
刚刚注释掉了。
C++ 中通常禁止重复默认参数,以避免编译器检查两种情况是否具有相同的值。