2009-09-22 10 views
9

Ich versuche, geschützte Variablen einer Vorlageklasse mit verschiedenen Vorlagenparameter zugreifen. Ein Freund Erklärung mit Template-Parameter wird die folgende Fehlermeldung geben:Vorlage Freundschaft

mehrere Vorlagenparameterlisten

Mein Code nicht erlaubt ist

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

Wenn ich den Schutz und Freund Erklärung funktioniert es entfernen.

+0

MyClass ist ein Freund von ihm selbst? !! – AraK

+3

MyClass ist nicht dieselbe Klasse wie MyClass daher kann es nicht auf seine geschützten Variablen zugreifen. –

+0

AraK gibt es keine 'MyClass' als solche. –

Antwort

10

Aus dem Standard: „Ein Freund Vorlage darf nicht teilweise Spezialisierungen deklariert werden“ 14.5.3/9 [temp.friend], so können Sie nur ‚anfreunden‘, um alle Instanzen einer Klasse-Vorlage oder spezifischen volle Spezialisierungen.

In diesem Fall müssen Sie die Klassenvorlage als Freund deklarieren, da Sie mit Instanziierungen mit einem freien Vorlagenparameter befreundet sein möchten.

z.B.

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

Das folgende scheint zu funktionieren, effektiv alle MyClass-Typen zu erklären, Freund miteinander zu sein.

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