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ê?

kakush
fonte
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;
Ed Heal
fonte
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

Vyktor
fonte
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;
Zhenxiao Hao
fonte
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;
Raghuram
fonte