【问题标题】:Template member function overloading issue模板成员函数重载问题
【发布时间】:2015-02-27 07:00:50
【问题描述】:

N4296::13.1/2.2 [over.load] 的标准说:

同样,同名的成员函数模板声明, 相同的参数类型列表和相同的模板参数列表 如果其中任何一个是静态成员函数,则不能重载 模板声明。

所以,我认为下面的程序格式不正确:

#include <iostream>

struct A
{
    template <typename T>
    static void foo(){ }

    template <typename T>
    static int foo(){ return 0; }
};

int main(){ }

DEMO

相比之下,程序

#include <iostream>

struct A
{
    static void foo(){ }

    static int foo(){ return 0; }
};

int main(){ }

格式不正确

DEMO

第一个例子是错误吗?

【问题讨论】:

  • @T.C.我的意思是功能是静态的。在演示中他们是。
  • 是的,它的格式不正确,并且无法诊断它是一个编译器错误。
  • 尝试实例化其中的任何一个,编译器会报告一个问题。我猜它会通过定义检查(第一阶段查找),但在第二阶段查找重载解决方案的实例化过程中会捕获错误。 GCC 在实例化时做到这一点
  • @SeverinPappadeux 不,该程序应该是不正确的,即使名称没有被使用。
  • 哪些编译器无法诊断第一个示例?

标签: c++ templates language-lawyer overloading


【解决方案1】:

目前CWG #1252的主题:

标准不允许重载那些 仅在返回类型上有所不同(参见 enable_if)。

您引用的措辞可能会被修改,因为没有任何理由禁止在返回类型中基于 SFINAE 重载成员函数模板;我认为标准是有缺陷的,而实施是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多