2009-09-22 14 views
9

Estoy intentando acceder a las variables protegidas de una clase de plantilla con diferentes parámetros de plantilla. Una declaración amigo con parámetros de plantilla está dando el siguiente error:Amigo de la plantilla

múltiples listas de parámetros de plantilla no se les permite

Mi código es

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 quito la declaración de protección y amigo funciona.

+0

MyClass es un amigo de sí mismo !! – AraK

+3

MyClass no es de la misma clase que MyClass por lo tanto, no puede acceder a sus variables protegidas. –

+0

AraK no hay 'MyClass' como tal. –

Respuesta

10

de la norma: "especializaciones parciales Una plantilla amigo no podrá ser declarado" 14.5.3/9 [temp.friend], por lo que sólo puede 'hacerse amigo' todas las instancias de una plantilla de clase o específica especializaciones completas

En su caso, como quiere ser amigo de instancias con un parámetro de plantilla libre, necesita declarar la plantilla de clase como un amigo.

p. Ej.

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

Lo siguiente parece estar funcionando, declarando efectivamente que todos los tipos de MyClass son amigos entre sí.

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