write tutorial makefiles make how for example compiler c++ gcc gcc4.7

c++ - tutorial - GCC bug o UB? ¿Debería este código compilar?



makefile linux (1)

No es válido C ++ según el estándar original:

14.3.1 de la norma dice:

2 Un tipo local, un tipo sin enlace, un tipo sin nombre o un tipo compuesto de cualquiera de estos tipos no se utilizará como un argumento de plantilla para un parámetro de tipo de plantilla. [Ejemplo: ...

Sin embargo, creo que esta restricción fue eliminada por el último estándar de C ++ 11. Eso puede explicar por qué algunos compiladores lo aceptan, mientras que otros lo rechazan.

El código a continuación compila bien con clang, pero no compila con GCC (probado 4.1.2, 4.5.4 y 4.7.2):

template <typename T> struct A { struct B { }; }; template <typename T> bool operator==(typename A<T>::B const& b, T const& t); enum { BAR }; template <typename T> bool test() { return 0 == BAR; }

El mensaje de error de GCC 4.7.2 es:

a.cpp: In instantiation of ‘struct A<<anonymous enum> >’: a.cpp:12:6: required by substitution of ‘template<class T> bool operator==(const typename A<T>::B&, const T&) [with T = <anonymous enum>]’ a.cpp:19:17: required from here a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’ a.cpp:6:12: error: ‘<anonymous enum>’ is/uses anonymous type a.cpp:6:12: error: trying to instantiate ‘template<class T> struct A<T>::B’

¿ GCC razón al rechazar el código, o estoy golpeando su error?

PS He visto este error al intentar crear uno de los proyectos de código abierto. Intenté hacer el menor ejemplo posible que lo reproduce.