¿Es posible de alguna manera hacer una especificación de plantilla parcial una clase de amigo? Es decir. considerar la posibilidad de tener la siguiente clase de plantillaPlantillas C++: Especificaciones parciales de plantillas y clases de amigos
template <class T> class X{
T t;
};
Ahora usted tienen especializaciones parciales, por ejemplo, para los punteros
template <class T> class X<T*>{
T* t;
};
Lo que quiero lograr es que cada posible X<T*>
es una clase de amigo del X<S>
para CUALQUIER S
. Es decir. X<A*>
debería ser un amigo de X<B>
.
Por supuesto, pensé en una plantilla amigo declaración habitual en X:
template <class T> class X{
template <class S> friend class X<S*>;
}
Sin embargo, esto no se compila, g ++ me dice esto:
test4.cpp: 34: 15: error : especialización de 'template<class T> class X
' debe aparecer al alcance de espacio de nombres
test4.cpp: 34: 21: error: especialización parcial 'X<S*>
' declaró 'amigo'
¿Esto no es posible o hay alguna solución?
La razón por la que estoy pidiendo es que necesito un constructor en X<T*>
que crea esta clase de una arbitraria X<S>
(S
debe ser un subtipo de T
).
El código es el siguiente:
template <class T> class X<T*>{
T* t;
template<class S>
X(X<S> x) : t(&(x.t)) {} //Error, x.t is private
}
Ahora, el compilador se queja, por supuesto, que no es x.t
visibile en el constructor, ya que es privado. Es por eso que necesito una clase de amigo de especialización parcial.
¿Es una función 'get' realmente fuera de cuestión? Esto me parece mucho más limpio y evita toda la locura de amigo de plantilla. – pmr
podría funcionar en este ejemplo tal vez. Sin embargo, puede haber datos que no deben exponerse al público, sino solo a las especializaciones de plantilla. La pregunta es si este comportamiento es posible de alguna manera. – gexicide