Anladığım kadarıyla, C ++, statik const üyelerinin bir tamsayı türü olduğu sürece bir sınıf içinde tanımlanmasına izin veriyor.
Öyleyse neden aşağıdaki kod bana bir bağlayıcı hatası veriyor?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Aldığım hata:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
İlginç bir şekilde, std :: min çağrısına yorum yaparsam, kod derlenir ve bağlanır (test :: N'ye önceki satırda da başvurulsa bile).
Neler olduğuna dair bir fikriniz var mı?
Derleyicim Linux'ta gcc 4.4.
char
bunun yerine olarak tanımlayabilirsiniz constexpr static const char &N = "n"[0];
. Not &
. Sanırım bu işe yarıyor çünkü değişmez dizeler otomatik olarak tanımlanıyor. Yine de bunun için biraz endişeliyim - dize muhtemelen birden fazla farklı adreste olacağından, farklı çeviri birimleri arasında bir başlık dosyasında garip davranabilir.
inline const int N = 10
hala bir yerde linker tarafından tanımlanan bir depolama alanı var. Bu durumda , sınıf tanımlama testi içinde statik değişken tanımı sağlamak için satır içi anahtar kelime de kullanılabilir .