Si intento compilar el siguiente código C++ 0x, me sale un error:error utilizando un constexpr como un parámetro de plantilla dentro de la misma clase
template<int n> struct foo { };
struct bar {
static constexpr int number() { return 256; }
void function(foo<number()> &);
};
con GCC 4.6.1, el mensaje de error es :
test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’
con sonido metálico 2.8, el mensaje de error es:
test.cc:6:20: error: non-type template argument of type 'int' is not an integral
constant expression
void function(foo<number()> &);
^~~~~~~~
1 error generated.
Si muevo la función constexpr
a una base de c lass, funciona en gcc, y le da el mismo mensaje de error en sonido metálico:
template<int n> struct foo { };
struct base {
static constexpr int number() { return 256; }
};
struct bar : base {
void function(foo<number()> &);
};
es el código incorrecto, o se trata de una limitación o error en la aplicación de C++ 0x gcc 4.6? Si el código es incorrecto, ¿por qué está mal y qué cláusulas del estándar C++ 11 dicen que es incorrecto?
Hmm .. Creo que acabamos de discutir esto antes: la definición de funciones en línea son tratados como si se definieron * * justo después de la definición de clase; por lo tanto, dentro de la definición de la clase todavía no están disponibles. Tenga en cuenta que siempre puede decir 'static const int number = 256;' o 'static constexpr int number = 256;' en su lugar. –
@KerrekSB oh, nunca lo supe. Deberías escribir eso como una respuesta. –
@KerrekSB: AFAIK, si uso 'static const int number = 256;', también necesito un 'const int bar :: number;', que agregaría inútilmente 4 bytes inútiles a '.data'. Usar una función en línea evita eso. No tengo idea si ese también es el caso para 'constexpr int number = 256;' estático, sin embargo. – CesarB