2017-02-15 3 views
4

クラスB<certain X>は、すべてC<any,certain X>と友人になりたいと考えています。
私はそれをする方法を見つけるために私の髪を引っ張っています。"template using"で定義されたテンプレート(エイリアス)クラスを持つ友達とのやり取りは?

以下は、問題のある行を追加しない限り正常にコンパイルされた完全なコードです。ここで

#include <string> 
using namespace std; 

enum EN{ EN1,EN2 }; 
template<EN T1,class T2> class C{ 
    public: C(){ 
     std::cout<<T1<<std::endl; 
    } 
}; 
template<class T2> class B{ 
    template<EN T1> using CT = C<T1,T2>; 
    //template<EN TX> friend class CT; //<-- error if insert this line 
    public: static void test(){ 
     CT<EN1> ct; 
    } 
}; 

int main() { 
    B<int>::test(); 
    return 0; 
} 

(すべての失敗)私が試したものです: -

template<EN T1> friend class C<T1,T2>; 
template<EN TX> friend class CT; 
template<typename TX> friend class CT; 
template<class TX> friend class CT; 
template<class TX> friend class CT<TX>;  
template<typename> friend typename CT; 

質問:挿入する正しい文の(1ライン)とは何ですか?
可能であれば、friendのステートメントにCではなくCTを使用します。

私はa similar questionthisと読みましたが、私よりも簡単です。
(私はC++に新しいです。)

答えて

4

クラスBは、すべてのC.

と友人になりたいtemplate friendは部分的特殊化を参照することはできませんので、残念ながらそれは、不可能です。この問題はusingとは関係ありません。

フレンド宣言は、部分的な特殊化を参照することはできませんが、列挙型ENはあまり列挙子を持っていない場合は、回避策としてフルspecilizationsを使用することができ、完全な専門

を参照することができます。例えば

template<class T2> class B { 
    template<EN T1> using CT = C<T1, T2>; 
    friend CT<EN1>; // same as friend C<EN1, T2>; 
    friend CT<EN2>; // same as friend C<EN2, T2>; 
    ... 
}; 
+0

プレーンC(CTとのコントラスト)と同じですか?すなわち、2つのフレンドステートメントが必要ですか? – javaLover

+0

@javaLoverはい、それは同じです。 – songyuanyao

関連する問題