我有一个简单的模板示例,如下所示:
template<class T> class A {
friend int f(T);
}
int main(){
A<int> a;
return 0;
}
该代码在VS2008中编译并执行时没有警告(未使用的变量除外)。我相信应该有一个问题,因为我们在同一个类中只有一个定义获得了许多版本的非模板函数。我错过了什么吗?
答案 0 :(得分:1)
根据C ++标准,未使用的模板函数的语法检查程度取决于实现。编译器不进行任何语义检查 - 例如,不查找符号。
答案 1 :(得分:1)
为什么这段代码会产生错误?对于您实例化T
的每个A
,将声明一个新函数并使其成为可能。永远不会有两个相同的函数,因为您无法为同一类型实例化两次模板(您只需重用旧的实例化)。
此外,即使以某种方式可能生成两个相等的声明,也不会产生歧义,因为函数首先在类中声明。因此,除了参数依赖查找之外,它们永远不会被找到。 (基本上,这些功能无用,因为它们无法调用)
§7.3.1.2 [namespace.memdef] p3
[...]如果非本地类中的
friend
声明首先声明一个类或函数,那么友元类或函数是最内层封闭命名空间的成员。 在该命名空间范围内提供匹配声明(在授予友谊的类定义之前或之后),通过非限定查找或限定查找找不到朋友的姓名。 [...]