2009-09-22 3 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; 
};