Digamos que estoy creando una clase para un árbol binario, BT
, y tengo una clase que describe un elemento del árbol, BE
, algo así comoPlantilla de clase con amigo de clase de plantilla, ¿qué está pasando realmente aquí?
template<class T> class BE {
T *data;
BE *l, *r;
public:
...
template<class U> friend class BT;
};
template<class T> class BT {
BE<T> *root;
public:
...
private:
...
};
Esto parece funcionar; Sin embargo, tengo preguntas sobre lo que está sucediendo debajo.
originalmente trató de declarar el amigo como
template<class T> friend class BT;
sin embargo, parece necesario utilizar U
(o algo distinto de T
) aquí, ¿por qué es esto? ¿Implica que cualquier particular BT
es amigo de cualquier clase en particular BE
?
La página de IBM en plantillas y amigos tiene ejemplos de diferentes tipos de relaciones de amigos para funciones pero no para clases (y adivinar que la sintaxis aún no ha convergido en la solución). Preferiría entender cómo obtener las especificaciones correctas para el tipo de relación de amigo que deseo definir.
esta construcción en mi código amigo clase BT genera un error para el amigo línea de error : 'BT' no es una plantilla aunque se haya declarado más tarde como plantilla clase BT { ... } –
Así que el secreto es que necesitaba reenviar declarar BT para usar la clase de amigo BT; línea en el BE, pero no para la plantilla clase de amigo BT ;. ¡Gracias por la ayuda! –
Para ser más específicos: debe reenviar declarar 'plantilla clase BT;' _antes de la definición de BE, y luego usar 'clase de amigo BT ;' _inside_ la clase BE. –