2009-09-22 10 views
9

J'essaye d'accéder aux variables protégées d'une classe de modèle avec différents paramètres de modèle. Une déclaration d'ami avec des paramètres de modèle donne l'erreur suivante:Amitié de modèle

plusieurs listes de paramètres de modèle ne sont pas autorisés

Mon code est

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

Si je supprime la protection et la déclaration ami cela fonctionne.

+0

MyClass est un ami de lui-même? !! – AraK

+3

MyClass n'est pas la même classe que MyClass par conséquent, il ne peut pas accéder à ses variables protégées. –

+0

AraK il n'y a pas de MyClass en tant que tel. –

Répondre

10

de la norme: «Un modèle ami ne doit pas être déclaré spécialisations partielles » 14.5.3/9 [temp.friend], et vous ne pouvez « lier d'amitié avec » tous les instanciations d'un modèle de classe ou spécifique spécialisations complètes.

Dans votre cas, comme vous voulez être ami avec des instanciations avec un paramètre de modèle gratuit, vous devez déclarer le modèle de classe en tant qu'ami.

par exemple.

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

L'opération suivante semble fonctionner, déclarant effectivement que tous les types MyClass sont amis les uns avec les autres.

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