2017-02-15 60 views
4

類別B<certain X>想與任何一個C<any,certain X>成爲好友。
我拉我的頭髮,找到如何做到這一點。如何使用由「模板使用」定義的模板(別名)類的朋友?

下面是成功編譯的完整代碼,只要我不添加有問題的行。

#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線)插入?
如果可能,我希望朋友聲明使用CT而不是C

我已閱讀a similar questionthis,但它們比我的簡單。
(我是新來的C++)。

回答

4

B類想成爲朋友與每一個C.

不幸的是,這是不可能的,因爲template friend不能引用部分特例。這個問題與using無關。

朋友申報不能引用部分特例,但可參考全面專業化

你可以使用全specilizations作爲解決辦法,如果枚舉EN沒有太多枚舉。例如

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