c++ - 为什么我不能模板重载?

标签 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; }
};

但如果我像这样使用默认类型定义两个 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/

相关文章:

c++ - 跨类的多个实例调用一次函数

模板类中的 C++20 类外定义

c++ - 将类型特征与可变参数模板参数一起使用

c++ - 转发成员函数到静态方法

sockets - 在ASIO Reactor中使用Lambda的Auto vs Typedef

c++ - 属性的 QVariant(QString, “” ) 在属性系统中是什么意思?

c++ - 将 map 与 vector 和缓存影响结合使用

c++ - 为什么标准类型不提供来自分配器不同的源的转换构造函数/赋值

sql - Azure ARM 模板 "VmAgentNotRunning"

c++ - vector - 当元素有 const 成员时交换两个元素