我们有两个类模板:A和B,以及函数模板f1()。如下所示:
template< class T >
class A{};
template< class T >
class B
{
friend class A<T>; /* Expression 1 */
friend void f1( B<T> &b ); /* Expression 2 */
};
template< class T >
void f1( B<T> &b ) {}
int main()
{
A< int > a;
B< int > b;
f1( b );
return 0;
}问题1:表达式1使A与参数T的专业化成为B与论点T的专业化的朋友,但如何使A的每一种专业化都成为B的专门化朋友呢?
问题2:如何定义类定义之外的f1?这样的代码将生成一个错误:
undefined reference to `f1(B<int>&)'问题3:如何使所有f1()s (谁可以接受B的所有专门化作为参数)成为B的每个专门化的朋友?
发布于 2012-03-13 15:27:24
问题1:
你真的想这么做吗?您想让A<int>访问B<float>吗?通常你不会,但如果你真的想:
template <typename U>
friend class A;问题2:
2中的问题是,您并不是让f1模板的实例化成为朋友,而是尝试使一个非模板的免费函数f1将B<int>作为您的朋友。要与特定实例化建立朋友关系的正确语法很麻烦:
template <typename T> class B;
template <typename T> void f( B<T>& );
template <typename T>
class B {
friend void f<T>( B<T>& );
};问题3:
要使f1的所有专门化成为朋友(同样,您真的想这样做吗?),您可以执行与类模板相同的方法:
template <typename U>
friend void f1( B<U>& );更多关于那些here
发布于 2012-03-13 15:21:59
问题1:使用
template <typename U> friend class A; 而不是
friend class A<T>;问题2:表达式2所做的是将一个普通函数声明为B,而不是函数模板的专门化。要声明for为T的专门化,需要for子句查看f1的声明,并添加<>标记f1是一个专门化而不是重载的正常函数,因此
template< class T >
class B;
template< class T >
void f1( B<T> &b );
template< class T >
class B
{
friend void f1<>( B<T> &b );
};
template< class T >
void f1( B<T> &b ) {}问题3的解决方案是两者的混合:
class B;
template< class T >
void f1( B<T> &b );
template< class T >
class B
{
template <typename U> friend void f1( B<U> &b );
};https://stackoverflow.com/questions/9686815
复制相似问题