theme plantillas plantilla elegant divi content c++ class templates

c++ - plantillas - Plantilla de clase con amigo de clase de plantilla, ¿qué está pasando realmente aquí?



plantillas divi (4)

Digamos que estoy creando una clase para un árbol binario, BT , y tengo una clase que describe un elemento del árbol, BE , algo así como

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.

Intenté originalmente declarar al amigo como

template<class T> friend class BT;

sin embargo, parece necesario usar U (o algo diferente de T ) aquí, ¿por qué es esto? ¿Implica que cualquier BT particular es amigo de cualquier clase de BE particular?

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.


En mi caso, esta solución funciona correctamente:

template <typename T> class DerivedClass1 : public BaseClass1 { template<class T> friend class DerivedClass2; private: int a; }; template <typename T> class DerivedClass2 : public BaseClass1 { void method() { this->i;} };

Espero que sea util.


No es necesario nombrar los parámetros para que tenga menos puntos de falla si se refactoriza:

template <typename _KeyT, typename _ValueT> class hash_map_iterator{ template <typename, typename, int> friend class hash_map; ...


para hacerse amigo de otra estructura del mismo tipo:

template<typename T> struct Foo { template<typename> friend struct Foo; };

tenga en cuenta que en la template<typename> friend struct Foo; no debe escribir T después de typename / class ; de lo contrario, causaría un error de sombreado de parm de plantilla.


template<class T> class BE{ template<class T> friend class BT; };

No está permitido porque los parámetros de la plantilla no pueden oscurecerse entre sí. Las plantillas anidadas deben tener diferentes nombres de parámetros de plantilla.

template<typename T> struct foo { template<typename U> friend class bar; };

Esto significa que bar es amigo de foo independientemente de los argumentos de plantilla de bar . bar<char> , bar<int> , bar<float> , y cualquier otra bar sería amiga de foo<char> .

template<typename T> struct foo { friend class bar<T>; };

Esto significa que bar es amigo de foo cuando el argumento de la plantilla de bar coincide con foo ''s. Solo bar<char> sería amigo de foo<char> .

En tu caso, friend class bar<T>; debería ser suficiente