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?
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. –
@hvd, incorrecto. esos deben ser declarados constexpr. –
@SegFault También recibo estos errores con MinGW 4.7 – TemplateRex