为什么VS 2008编译没有错误的模板逻辑警告?

时间:2012-01-06 02:09:29

标签: c++ templates

我有一个简单的模板示例,如下所示:

template<class T> class A {
   friend int f(T);
}

int main(){
   A<int> a;
   return 0;
}

该代码在VS2008中编译并执行时没有警告(未使用的变量除外)。我相信应该有一个问题,因为我们在同一个类中只有一个定义获得了许多版本的非模板函数。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

根据C ++标准,未使用的模板函数的语法检查程度取决于实现。编译器不进行任何语义检查 - 例如,不查找符号。

答案 1 :(得分:1)

为什么这段代码会产生错误?对于您实例化T的每个A,将声明一个新函数并使其成为可能。永远不会有两个相同的函数,因为您无法为同一类型实例化两次模板(您只需重用旧的实例化)。

此外,即使以某种方式可能生成两个相等的声明,也不会产生歧义,因为函数首先在类中声明。因此,除了参数依赖查找之外,它们永远不会被找到。 (基本上,这些功能无用,因为它们无法调用)

§7.3.1.2 [namespace.memdef] p3

  

[...]如果非本地类中的friend声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员。 在该命名空间范围内提供匹配声明(在授予友谊的类定义之前或之后),通过非限定查找或限定查找找不到朋友的姓名。 [...]

Also, see this