如何让类模板A<T>与任意A<T2>实例化互为友元?
让类模板的任意实例互为友元:可行,修正语法错误即可
当然可以实现让A<T>和A<T2>(无论T、T2是什么类型)互为友元的需求,你的代码问题出在友元模板的声明语法不符合C++标准。
错误原因分析
你写的友元声明:
template <typename T2> friend A;
编译器报错friend type templates must use an elaborated type,这是因为当声明类模板作为友元时,必须使用详尽类型说明符(elaborated type specifier)——也就是要明确写出class A,告诉编译器A是一个类模板,而非普通标识符。
修正后的代码
只需要把友元声明改成template <typename T2> friend class A;即可,完整代码如下:
template <class T> class A { public: template <typename T2> void test(A<T2>& a) { a.v_ = 2; // 现在可以合法访问任意A<T2>的私有成员 } private: int v_; // 声明所有A<T2>的实例都是当前A<T>的友元 template <typename T2> friend class A; }; int main() { A<int> a; A<double> b; // 测试不同类型的实例 b.test(a); return 0; }
原理说明
这个声明template <typename T2> friend class A;的作用是:对于当前的A<T>实例,所有A<T2>(T2可以是任意类型)的实例都被授予友元权限;反过来,每个A<T2>也会把所有A<T>实例声明为友元,这样就实现了任意实例之间互为友元的效果。
内容的提问来源于stack exchange,提问作者R zu
相关产品推荐
相关产品推荐

