2017-02-15 66 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