我正在尝试使用不同的模板参数访问模板类的受保护变量。带有模板参数的朋友声明会出现以下错误:
不允许使用多个模板参数列表
我的代码是
template<class O_, class P_>
class MyClass {
//multiple template parameter lists are not allowed
template<class R_> friend class MyClass<R_, P_>
//syntax error: template<
friend template<class R_> class MyClass<R_, P_>
public:
template<class R_>
ACopyConstructor(MyClass<R_, P_> &myclass) :
SomeVariable(myclass.SomeVariable)
{ }
protected:
O_ SomeVariable;
};
如果我删除了保护和朋友声明,它就能正常工作。
答案 0 :(得分:11)
从标准:14.5.3 / 9 [temp.friend],“朋友模板不应被声明为部分特殊化。”,因此您只能“成为”类模板或特定完整专业化的所有实例。 / p>
在您的情况下,由于您希望成为具有一个免费模板参数的实例化的朋友,您需要将类模板声明为朋友。
e.g。
template< class A, class B > friend class MyClass;
答案 1 :(得分:0)
以下似乎正在起作用,有效地声明所有MyClass类型彼此成为朋友。
template<class O_, class P_>
class MyClass {
template<class R_, class P_> friend class MyClass;
public:
template<class R_>
ACopyConstructor(MyClass<R_, P_> &myclass) :
SomeVariable(myclass.SomeVariable)
{ }
protected:
O_ SomeVariable;
};