Tengo entendido que C ++ permite que los miembros constantes estáticos se definan dentro de una clase siempre que sea un tipo entero.
Entonces, ¿por qué el siguiente código me da un error de vinculador?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
El error que obtengo es:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Curiosamente, si comento la llamada a std :: min, el código se compila y enlaza bien (aunque también se hace referencia a test :: N en la línea anterior).
¿Alguna idea de lo que está pasando?
Mi compilador es gcc 4.4 en Linux.
char
, puede definirlo como constexpr static const char &N = "n"[0];
. Tenga en cuenta el &
. Supongo que esto funciona porque las cadenas literales se definen automáticamente. Sin embargo, estoy un poco preocupado por esto: podría comportarse de manera extraña en un archivo de encabezado entre diferentes unidades de traducción, ya que la cadena probablemente estará en varias direcciones diferentes.
inline const int N = 10
, que hasta donde yo sé todavía tiene un almacenamiento en algún lugar definido por el enlazador. En este caso, también se podría usar la palabra clave en línea para proporcionar una definición de variable estática dentro de la prueba de definición de clase.