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]、「フレンド テンプレートは、部分的な特殊化を宣言してはならない」ため、クラス テンプレートのすべてのインスタンス化または特定の完全な特殊化のみを「フレンドにする」ことができます。

あなたの場合、1 つの無料のテンプレート パラメーターを使用してインスタンス化と友達になりたいので、クラス テンプレートを友達として宣言する必要があります。

例えば

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 に答える