2012-10-11 16 views
6

Consideremos el siguiente código de meta-programación simplificada plantilla que implementa una clase Angle que almacena internamente el módulo 360 grados valor reducido.Auto + estática initalization constante en su clase con meta-programación

#include <iostream> 
#include <typeinfo> 

template<int N, int D> 
struct Modulus 
{ 
     static auto const value = N % D; 
}; 

template<int N> 
struct Angle 
{ 
     static auto const value = Modulus<N, 360>::value; // ERROR 
     //static int const value = Modulus<N, 360>::value; // OK 
     //static auto const value = N % 360;    // OK 

     typedef Angle<value> type; 
}; 

int main() 
{ 
     std::cout << typeid(Angle<30>::type).name() << "\n"; 
     std::cout << typeid(Angle<390>::type).name() << "\n"; 

     return 0; 
} 

de salida en Ideone

Con Visual C++ 2010 Express, que puedo hacer static auto const = Modulus<N, 360>::value, pero con MinGW gcc 4.7.2 (Nuwen distro) o Ideone (gcc 4.5.1) Tengo que o bien designar explícitamente el escribir como static int const value = Modulus<N, 360>::value o tengo que usar auto con la expresión modular completo como static auto const value = N % 360;.

Pregunta: ¿Qué compilador es correcta acccording al nuevo estándar de C++ 11?

+0

Sí, en gcc 4.5.1 el apoyo para C++ 11 es todavía muy incompleta, usted debe comprobar http://gcc.gnu.org/projects/cxx0x.html para ver qué funciones están disponibles en la versión. –

+0

@hvd, incorrecto. esos deben ser declarados constexpr. –

+0

@SegFault También recibo estos errores con MinGW 4.7 – TemplateRex

Respuesta

1

El código es válido. Visual C++ está en lo correcto al aceptarlo y gcc está equivocado al rechazarlo (para completarlo, Clang 3.1 también acepta el código). La especificación establece que (C++ 11 7.1.6.4 [dcl.spec.auto]/4):

El autotipo especificador también se puede utilizar ... en la que se declara un miembro de datos estático con un aparato ortopédico o igual-inicializador que aparece dentro de la miembro-especificación de una definición de clase.

Su value es un miembro de datos estáticos. Tiene una aparato ortopédico o igual-inicializador (que es la parte = Modulus<N, 360>::value de la declaración), y aparece el inicializador dentro del miembro de especificación de la definición de clase (es decir, es lo que los mortales podrían llamar un "inicializador en línea ").

+0

+1 y aceptado. ¡Muchas gracias! ¿Cuál es la forma más adecuada de presentar un informe de error? – TemplateRex

+0

@rhalbersma: GCC tiene [una base de datos Bugzilla] (http://gcc.gnu.org/bugzilla/). Aunque no estoy familiarizado con sus procedimientos de informe de errores. Recomiendo buscar primero para ver si esto ya se ha informado. –

Cuestiones relacionadas