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?



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;

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


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;

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.