2009-09-22 12 views
9

Próbuję uzyskać dostęp do chronionych zmiennych klasy szablonu z różnymi parametrami szablonu. Oświadczenie przyjaciel z parametrów szablonu daje następujący błąd:Szablon przyjaźni

wiele list parametrów szablonu nie są dozwolone

Mój kod jest

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; 
}; 

Jeśli usunąć deklarację ochrony i przyjaciela to działa.

+0

MyClass jest jej przyjacielem? – AraK

+3

MyClass nie jest tą samą klasą co MyClass dlatego nie może uzyskać dostępu do swoich chronionych zmiennych. –

+0

AraK nie ma "MyClass" jako takiego. –

Odpowiedz

10

od standardu: „Znajomy szablon nie powinny być zadeklarowane częściowych specjalizacji” 14.5.3/9 [temp.friend], więc można tylko „zaprzyjaźnić” wszystkie dawałaby w szablonie klasy lub specyficzne pełne specjalizacje.

W twoim przypadku, jak chcesz się zaprzyjaźnić z dawałaby z jednym wolnym parametrem szablonu, trzeba zadeklarować szablonu klasy jako przyjaciela.

np.

template< class A, class B > friend class MyClass; 
0

Poniższy wydaje się działać skutecznie deklarowania wszystkich rodzajów myClass być przyjacielem ze sobą.

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; 
};