模板友谊

时间:2009-09-22 08:18:36

标签: c++ templates friend

我正在尝试使用不同的模板参数访问模板类的受保护变量。带有模板参数的朋友声明会出现以下错误:

不允许使用多个模板参数列表

我的代码是

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;
};

如果我删除了保护和朋友声明,它就能正常工作。

2 个答案:

答案 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;
};