que geeks friends for classes c++ friend template-specialization

geeks - friends class in c++



¿Por qué el Estándar prohíbe las declaraciones de amigos de especializaciones parciales? (2)

El estándar C ++ prohíbe las declaraciones de amigos de especializaciones parciales. (§14.5.3 / 8):

Las declaraciones de amigos no podrán declarar especializaciones parciales. [Ejemplo:

template<class T> class A { }; class X { template <class T> friend class A<T*>; //error };

--end ejemplo]

Otras preguntas, por ejemplo, esta , han recibido respuestas que invocan esta prohibición, pero me gustaría saber la razón. No lo veo y no lo encuentro con mi motor de búsqueda favorito. Sin embargo, puedo encontrar que se remonta al estándar C ++ 98, por lo que presumiblemente la razón es bastante básica y clara. ¿Alguien puede explicar me lo?


Aquí hay una explicación indirecta: http://www.cprogramming.com/tutorial/template_specialization.html

Un último detalle de implementación viene con especializaciones parciales: ¿cómo elige el compilador qué especialización usar si hay una combinación de tipos completamente genéricos, algunas especializaciones parciales e incluso algunas especializaciones completas? La regla general es que el compilador elegirá la especialización de plantilla más específica; la especialización de plantilla más específica es aquella cuyos argumentos de plantilla serían aceptados por las otras declaraciones de plantilla, pero que no aceptaría todos los argumentos posibles que otras plantillas tienen. el mismo nombre aceptaría

Yo infiero que tal vez no esté permitido evitar cualquier ambigüedad en la determinación del tipo de especialización.


No tengo una referencia, pero sospecho que esto se debe a que se declararía una especialización parcial en el ámbito de la clase de declaración de amigos en lugar del ámbito de la plantilla en cuestión, y en lugar de crear un conjunto de reglas. Para forzar que la declaración de amistad resulte en la especialización en el ámbito correcto, simplemente la prohíben.