为什么我不能模板超载?

Bar*_*rry 9 c++ templates c++11

为什么编译:

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

但是,如果我使用默认类型定义两个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)
Run Code Online (Sandbox Code Playgroud)

我收到此错误(第一行指向定义(B),第二行指向(A)):

error: 'template<bool flag, class> void Testable::foo()' cannot be overloaded
error: with 'template<bool flag, class>> void Testable::foo()'
Run Code Online (Sandbox Code Playgroud)

And*_*owl 8

编译器抱怨,因为两个函数模板具有相同的签名.C++ 11标准的第1.3.18段规定了函数模板的签名定义为:

<function template> 名称,参数类型列表(8.3.5),封闭命名空间(如果有),返回类型和模板参数列表

如您所见,默认模板参数不是签名的一部分.

您可以通过更改您的定义来解决此问题,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)
};
Run Code Online (Sandbox Code Playgroud)