2009-09-22 41 views
9

我试图访问具有不同模板参数的模板类的受保护变量。与模板参数的朋友声明是给下面的错误:模板友情

多个模板参数列表不允许

我的代码是

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

MyClass是它自己的朋友吗? – AraK 2009-09-22 08:22:24

+3

MyClass 与MyClass 不是同一个类,因此它无法访问其受保护的变量。 – 2009-09-22 08:23:49

+0

AraK没有这样的MyClass。 – 2009-09-22 08:25:00

回答

10

从标准:“一个朋友模板不得申报部分特例” 14.5.3/9 temp.friend],所以只能“笼络”类模板或特定的所有实例完全专业化。

就你而言,由于你想用一个免费的模板参数成为实例化的朋友,你需要将类模板声明为朋友。

例如

template< class A, class B > friend class MyClass; 
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; 
};