Rozumiem, że C ++ pozwala na definiowanie statycznych elementów stałych wewnątrz klasy, o ile jest to typ całkowity.
Dlaczego więc poniższy kod powoduje błąd konsolidatora?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Pojawia się błąd:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Co ciekawe, jeśli wykomentuję wywołanie std :: min, kod kompiluje się i łączy w porządku (mimo że odwołanie do testu :: N również znajduje się w poprzednim wierszu).
Masz jakiś pomysł, co się dzieje?
Mój kompilator to gcc 4.4 w systemie Linux.
char
możesz zdefiniować go jako constexpr static const char &N = "n"[0];
. Zwróć uwagę na &
. Myślę, że to działa, ponieważ ciągi literałów są definiowane automatycznie. Martwię się tym - może to zachowywać się dziwnie w pliku nagłówkowym między różnymi jednostkami tłumaczeniowymi, ponieważ łańcuch prawdopodobnie będzie znajdować się pod wieloma różnymi adresami.
inline const int N = 10
, który według mojej wiedzy nadal ma magazyn zdefiniowany przez linker. W tym przypadku można również użyć słowa kluczowego wbudowanego, aby podać definicję zmiennej statycznej w teście definicji klasy.