【发布时间】: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(){ }
相比之下,程序
#include <iostream>
struct A
{
static void foo(){ }
static int foo(){ return 0; }
};
int main(){ }
格式不正确
第一个例子是错误吗?
【问题讨论】:
-
@T.C.我的意思是功能是静态的。在演示中他们是。
-
是的,它的格式不正确,并且无法诊断它是一个编译器错误。
-
尝试实例化其中的任何一个,编译器会报告一个问题。我猜它会通过定义检查(第一阶段查找),但在第二阶段查找重载解决方案的实例化过程中会捕获错误。 GCC 在实例化时做到这一点
-
@SeverinPappadeux 不,该程序应该是不正确的,即使名称没有被使用。
-
哪些编译器无法诊断第一个示例?
标签: c++ templates language-lawyer overloading