Referência indefinida a um membro estático


93

Estou usando um compilador cruzado. Meu código é:

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

Eu obtenho o seguinte erro:

referência indefinida a `WindowsTimer :: _ frequência '

Eu também tentei mudar para

LARGE_INTEGER _frequency.QuadPart = 0ull;

ou

static LARGE_INTEGER _frequency.QuadPart = 0ull;

mas ainda estou recebendo erros.

alguém sabe por quê?



Onde (se houver) você definiu WindowsTimer::_frequency ?
CB Bailey

@CharlesBailey É o meu único membro da classe.
kakush

Respostas:


109

Você precisa definir _frequencyno arquivo .cpp.

ie

LARGE_INTEGER WindowsTimer::_frequency;

Por que devo fazer isso?
agora em

37

O Linker não sabe para onde alocar os dados _frequencye você tem que dizer isso manualmente. Você pode fazer isso simplesmente adicionando esta linha: LARGE_INTEGER WindowsTimer::_frequency = 0;em uma de suas fontes C ++.

Explicação mais detalhada aqui


32

Com C ++ 17, você pode declarar sua variável embutida , não há mais necessidade de defini-la em um arquivo cpp.

inline static LARGE_INTEGER _frequency;

Isso me dá um erroerror: 'foobar' declared as an 'inline' field
Pedro Henrique

3
NVM, acabei de atualizar meu GCC por meio do gerenciador MinGW de 6.3 para 8.2 e funciona bem.
Pedro Henrique

24

Se houver uma variável estática declarada dentro da classe, você deve defini-la no arquivo cpp como este

LARGE_INTEGER WindowsTimer::_frequency = 0;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.