Mi comprensión es que C++ permite que los miembros static const se definan dentro de una clase siempre que sea un tipo entero.Definición de miembros enteros const enteros en la definición de clase
¿Por qué, entonces, el siguiente código me da un error de enlazador?
#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 consigo es:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Curiosamente, si comento hacia fuera la llamada a std :: min, el código se compila y enlaces muy bien (a pesar de que la prueba :: N es también referenciado en la línea anterior).
¿Alguna idea de qué está pasando?
Mi compilador es gcc 4.4 en Linux.
Funciona bien en Visual Studio 2010. – Puppy
Este error exacto se explica en https://gcc.gnu.org/wiki/VerboseDiagnostics#missing_static_const_definition –
En el caso particular de 'char', puede definirlo en su lugar como' constexpr estático const char & N = "n" [0]; '. Tenga en cuenta el 'y'. 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. –