2009-09-22 12 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

+3

MyClass はMyClass と同じクラスではないため、保護された変数にアクセスすることはできません。 –

+0

AraKそのような「MyClass」はありません。 –

答えて

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; 
}; 
関連する問題