Referensi tidak ditentukan ke anggota statis

91

Saya menggunakan kompiler silang. Kode saya adalah:

class WindowsTimer{
public:
  WindowsTimer(){
    _frequency.QuadPart = 0ull;
  } 
private:
  static LARGE_INTEGER _frequency;
};

Saya mendapatkan kesalahan berikut:

referensi yang tidak ditentukan ke `WindowsTimer :: _ frekuensi '

Saya juga mencoba mengubahnya menjadi

LARGE_INTEGER _frequency.QuadPart = 0ull;

atau

static LARGE_INTEGER _frequency.QuadPart = 0ull;

tapi saya masih mendapatkan kesalahan.

ada yang tahu kenapa?

kakush
sumber
Di mana (jika ada) yang Anda tentukan WindowsTimer::_frequency ?
CB Bailey
@CharlesBailey Ini satu-satunya anggota saya di kelas.
kakush

Jawaban:

107

Anda perlu menentukan _frequencydalam file .cpp.

yaitu

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal
sumber
Mengapa saya harus melakukannya?
nowox
35

Linker tidak tahu ke mana harus mengalokasikan data _frequencydan Anda harus memberitahukannya secara manual. Anda dapat melakukannya dengan menambahkan baris ini: LARGE_INTEGER WindowsTimer::_frequency = 0;ke salah satu sumber C ++ Anda.

Penjelasan lebih detail ada di sini

Vyktor
sumber
28

Dengan C ++ 17, Anda dapat mendeklarasikan variabel Anda secara inline , tidak perlu lagi mendefinisikannya dalam file cpp.

inline static LARGE_INTEGER _frequency;
Zhenxiao Hao
sumber
Ini memberi saya kesalahanerror: 'foobar' declared as an 'inline' field
Pedro Henrique
3
NVM, saya baru saja memperbarui GCC saya melalui manajer MinGW dari 6,3 menjadi 8,2 dan berfungsi dengan baik.
Pedro Henrique
24

Jika ada variabel statis yang dideklarasikan di dalam kelas maka Anda harus mendefinisikannya di file cpp seperti ini

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram
sumber