11

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

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

我的代码是

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

如果我删除保护和朋友声明,它会起作用。

4

2 回答 2

13

来自标准:14.5.3/9 [temp.friend],“朋友模板不应被声明为部分特化。”,因此您只能“成为”类模板的所有实例化或特定的完整特化。

在您的情况下,由于您想成为具有一个免费模板参数的实例化的朋友,您需要将类模板声明为朋友。

例如

template< class A, class B > friend class MyClass;
于 2009-09-22T08:55:31.307 回答
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;
};
于 2009-09-22T08:43:04.347 回答