2017-02-15 1 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 라인)를 삽입하는 무엇입니까?
친구 문장의 경우 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 개의 friend 문장이 필요합니까? – javaLover

+0

@javaLover 네, 동일합니다. – songyuanyao

관련 문제