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?



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;

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


28

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

inline static LARGE_INTEGER _frequency;

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.