respuestas redactar redaccion para oficina modelo mensaje ideas fuera ejemplos ejemplo correos correo clientes autorespuesta automatico automaticas c++ templates

c++ - redactar - nombre de tipo fuera de la plantilla



redaccion mensaje fuera de oficina (3)

En este caso particular, parece que VS2010 tiene razón al rechazar el código:

14.6 / 5

La palabra clave typename se aplicará solo a los nombres calificados, pero esos nombres no necesitan ser dependientes. La palabra clave typename se usará solo en contextos en los que se puedan usar nombres dependientes. Esto incluye declaraciones de plantilla y definiciones, pero excluye declaraciones de especialización explícitas y declaraciones de creación de instancias explícitas.

Esto en VS2010sp1 no compila (sí compila con gcc 4.6):

template<class T> struct Upcast; template<> struct Upcast<signed char> { typedef signed short type; }; template<> struct Upcast<char> { typedef typename std::conditional<std::is_signed<char>::value,short, unsigned short>::type type; }; int main() { Upcast<char>::type a; return 0; }

Error de VS:

Error 1 error C2899: typename cannot be used outside a template declaration

¿Qué equipo tiene razón? VS o gcc?


Según C ++ 03, las palabras clave de typename y template no están permitidas en ninguna parte fuera de una plantilla, incluidas las especializaciones de plantilla explícitas (completas). Entonces MSVC ++ es correcto según C ++ 03

Según C ++ 0x, este código es correcto.


VS está justo en C ++ 03. GCC tiene razón en C ++ 0x.

Ahora puede ser razonable que GCC también permita esto en el modo C ++ 03 (hay muchas cosas que los compiladores reales no diagnostican en el modo C ++ 03 que en realidad solo son válidos en C ++ 0x), y puede -bien sensible para que VS lo rechace en el modo C ++ 03.

Ya no importa si un uso de typename QualifiedName ocurre en una plantilla o no, en C ++ 0x. Es decir, lo siguiente es perfectamente legal para C ++ 0x:

#include<vector> int main() { typename std::vector<int> v; }

En C ++ 03, typename solo podría usarse dentro de una plantilla. Y la especialización explícita en su código no es una plantilla. No hay cláusulas de template<typename T ...> (todos los parámetros en su código son fijos).