2011-06-28 17 views
7

En C++ 03, el siguiente es ilegal, aunque algunos compiladores lo admiten.Parámetro de plantilla como amigo

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

esto ha sido legalizado en C++ 11? (Lo siento, no tuve tiempo para leer el borrador yo solo, esperando que alguien lo sepa)

+1

[tag: amigo] es correcta para C++. – user7116

+4

[amigos] (http://www.stackoverflow.com/questions/tagged/friends) es para Facebook. –

+3

@Ken: me alegro de que no sea para el programa de televisión xD –

Respuesta

11

Desde la sección §11.3, 3 en N3291:

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 

para que sea legal en C++ 11.

+4

Estoy muy contento de que 'friend int;' sea ignorado :) –

1

Sí C++ 0x permite que el parámetro de la plantilla sea amigo.

Bueno, sucedió que recuerdo haberlo leído en el borrador anterior, pero no pude encontrar la referencia ... de todos modos la respuesta de @ Praetorian lo enganchó.

0

Es ilegal en llano C++, pero hay una solución simple

template <class T> 
class X 
{ 
    private: 
     class Wrapper 
     { 
      public: 
       typedef T Type; 
     }; 
     friend class Wrapper::Type; 
}; 
+0

Funciona en gcc pero no en VC2010 y Comeau – Sumant

+0

Sí, lo probé en Clang también, didn 't work :(- Aparentemente, el estándar prohíbe la creación de vínculos entre tipos tipificados que el GCC no verifica. Sin embargo, está permitido escribir 'friend T;' que GCC no reconoce, pero Clang sí. – Frigo

Cuestiones relacionadas