Niezdefiniowane odniesienie do statycznego elementu członkowskiego

91

Używam kompilatora krzyżowego. Mój kod to:

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

Otrzymuję następujący błąd:

niezdefiniowane odniesienie do `WindowsTimer :: _ frequency '

Próbowałem też zmienić to na

LARGE_INTEGER _frequency.QuadPart = 0ull;

lub

static LARGE_INTEGER _frequency.QuadPart = 0ull;

ale nadal otrzymuję błędy.

ktoś wie dlaczego?

kakush
źródło
Gdzie (jeśli gdziekolwiek) zdefiniowałeś WindowsTimer::_frequency ?
CB Bailey
@CharlesBailey To mój jedyny członek w klasie.
kakush

Odpowiedzi:

107

Musisz zdefiniować _frequencyw pliku .cpp.

to znaczy

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal
źródło
Dlaczego miałbym to zrobić?
nowox
35

Linker nie wie, gdzie przydzielić dane _frequencyi musisz to powiedzieć ręcznie. Możesz to osiągnąć poprzez proste dodanie tej linii: LARGE_INTEGER WindowsTimer::_frequency = 0;do jednego ze źródeł C ++.

Bardziej szczegółowe wyjaśnienie tutaj

Vyktor
źródło
28

W C ++ 17 możesz zadeklarować zmienną w tekście , nie musisz już definiować jej w pliku cpp.

inline static LARGE_INTEGER _frequency;
Zhenxiao Hao
źródło
To daje mi błąderror: 'foobar' declared as an 'inline' field
Pedro Henrique
3
NVM, właśnie zaktualizowałem GCC przez MinGW managera z 6.3 do 8.2 i działa dobrze.
Pedro Henrique
24

Jeśli wewnątrz klasy jest zadeklarowana zmienna statyczna, należy ją zdefiniować w pliku cpp w ten sposób

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram
źródło