Riferimento non definito a un membro statico


93

Sto usando un compilatore incrociato. Il mio codice è:

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

Ottengo il seguente errore:

riferimento indefinito a "WindowsTimer :: _ frequency"

Ho anche provato a cambiarlo in

LARGE_INTEGER _frequency.QuadPart = 0ull;

o

static LARGE_INTEGER _frequency.QuadPart = 0ull;

ma ricevo ancora errori.

qualcuno sa perchè?



Dove (se ovunque) hai definito WindowsTimer::_frequency ?
CB Bailey

@CharlesBailey È il mio unico membro della classe.
kakush

Risposte:


109

È necessario definire _frequencynel file .cpp.

cioè

LARGE_INTEGER WindowsTimer::_frequency;

Perché dovrei farlo?
nowox

37

Il linker non sa dove allocare i dati _frequencye devi dirlo manualmente. Puoi ottenere ciò aggiungendo semplicemente questa riga: LARGE_INTEGER WindowsTimer::_frequency = 0;in una delle tue fonti C ++.

Spiegazione più dettagliata qui


32

Con C ++ 17, puoi dichiarare la tua variabile inline , non c'è più bisogno di definirla in un file cpp.

inline static LARGE_INTEGER _frequency;

Questo mi dà un erroreerror: 'foobar' declared as an 'inline' field
Pedro Henrique

3
NVM, ho appena aggiornato il mio GCC tramite il gestore MinGW da 6.3 a 8.2 e funziona bene.
Pedro Henrique

24

Se c'è una variabile statica dichiarata all'interno della classe, dovresti definirla nel file cpp in questo modo

LARGE_INTEGER WindowsTimer::_frequency = 0;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.