Référence non définie à un membre statique

91

J'utilise un compilateur croisé. Mon code est:

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

J'obtiens l'erreur suivante:

référence non définie à `WindowsTimer :: _ frequency '

J'ai aussi essayé de le changer en

LARGE_INTEGER _frequency.QuadPart = 0ull;

ou

static LARGE_INTEGER _frequency.QuadPart = 0ull;

mais j'obtiens toujours des erreurs.

quelqu'un sait pourquoi?

kakush
la source
Où (le cas échéant) avez-vous défini WindowsTimer::_frequency ?
CB Bailey
@CharlesBailey C'est mon seul membre de la classe.
kakush le

Réponses:

107

Vous devez définir _frequencydans le fichier .cpp.

c'est à dire

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal
la source
Pourquoi devrais-je le faire?
nowox
35

Linker ne sait pas où allouer les données _frequencyet vous devez le dire manuellement. Vous pouvez y parvenir en ajoutant simplement cette ligne: LARGE_INTEGER WindowsTimer::_frequency = 0;dans l'une de vos sources C ++.

Explication plus détaillée ici

Vyktor
la source
28

Avec C ++ 17, vous pouvez déclarer votre variable en ligne , plus besoin de la définir dans un fichier cpp.

inline static LARGE_INTEGER _frequency;
Zhenxiao Hao
la source
Cela me donne une erreurerror: 'foobar' declared as an 'inline' field
Pedro Henrique
3
NVM, je viens de mettre à jour mon GCC via le gestionnaire MinGW de 6.3 à 8.2 et cela fonctionne très bien.
Pedro Henrique
24

S'il y a une variable statique déclarée à l'intérieur de la classe, vous devez la définir dans le fichier cpp comme ceci

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram
la source