2009-06-17 11 views
6

Cuando la investigación de una respuesta a una pregunta (basado en this answer) he tratado de hacer lo siguiente:¿Por qué no puedo hacer amistad con un parámetro de plantilla?

template <class T> 
class friendly { 
    friend class T; 
}; 

friendly<string> howdy; 

Esta falla al compilar con el siguiente error:

error: template parameter "T" may not be used in an elaborated type specifier friend class T;

De lo que puedo entender desde mi buen amigo Google esto es para que no intente accidentalmente crear una instancia de friendly<int>, pero ¿por qué debería ser un error al compilar la plantilla? No debería ser un error al crear una instancia de la plantilla con un tipo no válido (como lo escribí int f() { return T::foo(); })

+5

Cómo hacer amigos e influir en los parámetros. – TheTXI

+1

Aquí hay una pregunta relacionada: http://stackoverflow.com/questions/392120/why-cant-i-declare-a-friend-through-a-typedef –

Respuesta

2

Un poco más googleling criados extendidas friend Declaraciones(PDF) para C++0x.

Este documento contiene lo siguiente:

template <typename T> class R { 
    friend T; 
}; 
R<C> rc; // class C is a friend of R<C> 
R<int> ri; // OK: “friend int;” is ignored 

que va incluso más allá de lo que pensaba (ignorando friend desaceleraciones ilegales en lugar de fallar durante la instanciación). Así que supongo que la respuesta es que no hay una buena razón y que está siendo rectificada.

3

La sección 7.1.5.3 de la norma describe explícitamente esto como un ejemplo de un especificador de tipo elaborado elaborada.

Se puede encontrar una discusión sobre el tema here.

+0

+1, buen descubrimiento. Recuerdo embestir contra esta vez. Sin embargo, no sé por qué está prohibido: tal vez haya causado dificultades para los implementadores de compiladores. –

+1

No cuestiones la Biblia, hijo. –

+0

Eché un vistazo al hilo al que se hace referencia y, aparte de señalar que es ilegal, no hay una idea de por qué (que es lo que busco en esta pregunta). – Motti

Cuestiones relacionadas