Pemahaman saya adalah bahwa C ++ memungkinkan anggota konstanta statis untuk didefinisikan di dalam kelas selama itu adalah tipe integer.
Lalu, mengapa kode berikut memberi saya kesalahan penaut?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
Kesalahan yang saya dapatkan adalah:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Menariknya, jika saya mengomentari panggilan ke std :: min, kode mengkompilasi dan tautan dengan baik (meskipun test :: N juga direferensikan pada baris sebelumnya).
Tahu apa yang terjadi?
Kompiler saya adalah gcc 4.4 di Linux.
char
, Anda dapat mendefinisikannya sebagai constexpr static const char &N = "n"[0];
. Perhatikan &
. Saya kira ini berfungsi karena string literal didefinisikan secara otomatis. Saya agak khawatir tentang ini - ini mungkin berperilaku aneh di file header di antara unit terjemahan yang berbeda, karena string mungkin akan berada di beberapa alamat berbeda.
inline const int N = 10
, yang menurut pengetahuan saya masih memiliki penyimpanan di suatu tempat yang ditentukan oleh linker. Kata kunci sebaris juga dapat digunakan dalam kasus ini untuk memberikan definisi variabel statis di dalam pengujian definisi kelas.