以下包含朋友声明的代码失败并显示错误(请参阅http://ideone.com/Kq5dy):
template<class T> void foo() {}
template<typename T>
class A {
void foo();
friend void foo<T>(); // error: variable or field 'foo' declared void
};
int main()
{
foo<int>();
}
如果友元声明和成员函数声明的顺序相反,则代码编译没有问题(参见http://ideone.com/y3hiK):
template<class T> void foo() {}
template<typename T>
class A {
friend void foo<T>();
void foo();
};
int main()
{
foo<int>();
}
如果朋友声明不包含模板特化,则不会发生这种情况:非模板朋友是可以的,以及模板朋友。在模板特化中使用限定名也可以编译代码。我的问题是为什么第一个例子失败了?似乎编译器在朋友声明时在类范围内查找名称并且仅用于模板专业化?标准在哪里规定了这种行为?