为什么编译:
class Testable {
public:
template <bool flag>
typename std::enable_if<flag>::type
void foo() { cout << "Yay" << endl; }
template <bool flag>
typename std::enable_if<!flag>::type
void foo() { cout << "Nay" << endl; }
};
但如果我像这样使用默认类型定义两个 foos 则不会:
template <bool flag, typename = typename std::enable_if<flag>::type>
void foo() { cout << "Yay" << endl; } // (A)
template <bool flag, typename = typename std::enable_if<!flag>::type>
void foo() { cout << "Nay" << endl; } // (B)
我收到此错误(第一行指向 (B)
的定义,第二行指向 (A)
):
error: 'template<bool flag, class> void Testable::foo()' cannot be overloaded
error: with 'template<bool flag, class>> void Testable::foo()'
最佳答案
编译器会报错,因为两个函数模板具有相同的签名。 C++11 标准的第 1.3.18 段规定了函数模板的签名由什么定义:
<function template>
name, parameter type list (8.3.5), enclosing namespace (if any), return type, and template parameter list
如您所见,默认模板参数不是签名的一部分。
您可以通过更改 Testable
的定义来解决此问题如下:
class Testable {
public:
template <bool flag, typename std::enable_if<flag>::type* = nullptr>
void foo() { cout << "Yay" << endl; } // (A)
template <bool flag, typename std::enable_if<!flag>::type* = nullptr>
void foo() { cout << "Nay" << endl; } // (B)
};
关于c++ - 为什么我不能模板重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16242400/