La mia comprensione è che C ++ consente di definire membri const statici all'interno di una classe purché sia un tipo intero.
Perché, allora, il codice seguente mi dà un errore del linker?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
L'errore che ottengo è:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
È interessante notare che, se commento la chiamata a std :: min, il codice si compila e si collega correttamente (anche se test :: N è indicato anche nella riga precedente).
Qualche idea su cosa sta succedendo?
Il mio compilatore è gcc 4.4 su Linux.
char
, puoi definirlo invece come constexpr static const char &N = "n"[0];
. Nota il &
. Immagino che funzioni perché le stringhe letterali vengono definite automaticamente. Sono un po 'preoccupato per questo però - potrebbe comportarsi in modo strano in un file di intestazione tra diverse unità di traduzione, poiché la stringa sarà probabilmente a più indirizzi diversi.
inline const int N = 10
, che per quanto ne so ha ancora una memoria da qualche parte definita dal linker. La parola chiave inline potrebbe anche essere utilizzata in questo caso per fornire la definizione di variabile statica all'interno del test di definizione della classe.