【发布时间】:2015-01-04 15:35:35
【问题描述】:
代码
template <typename T>
void foo(const T& t)
{}
template <typename T>
class A
{
template <>
friend void foo<T>(const T& t)
{}
};
给出编译错误
"defining explicit specialization ‘foo<T>’ in friend declaration friend void foo<T>(const T& t)"
当使用 gcc 和
编译时"error C3637: 'A<int>::foo' : a friend function definition cannot be a specialization of a unction template"
在 VS2013 中编译时
我知道标准是这样说的,但是为什么呢?我想了解原因(幕后) 有很多文章写着“显式专业化不能是朋友声明。”,但我不明白为什么。有什么想法吗?
【问题讨论】:
-
gcc 报告给定代码的
explicit specialization in non-namespace scope 'struct A<T>'和template-id 'foo<T>' in declaration of primary template。 -
对不起,我从其他来源复制粘贴
-
显式特化防止隐式实例化。每次为一组新的模板参数实例化
A时,您都会添加另一个显式的foo特化。如果foo已经为相同的模板参数 [temp.expl.spec]/6 隐式实例化,则添加该特化是不正确的,不需要诊断。 -
@dyp 如果我清楚地理解您的评论,那么对于类模板中的每个函数模板专业化都是如此,而不仅仅是朋友?但编译错误与友元函数特化有关。除了在评论中提到的之外,我认为对朋友来说还有一些特别的东西
-
这适用于任何类型的模板(在显式特化之前使用相同的模板参数进行隐式实例化是格式错误的,NDR)。但是,您显示的代码将添加新的显式特化的方式很可能会发生此类违规行为,因为 a)新的特化将被隐式添加,并且 b)在主模板之外的另一个范围内。
标签: c++ templates friend-function explicit-specialization