Невизначене посилання на статичний член


91

Я використовую крос-компілятор. Мій код:

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

Я отримую таку помилку:

невизначене посилання на `WindowsTimer :: _ частота '

Я також намагався змінити його на

LARGE_INTEGER _frequency.QuadPart = 0ull;

або

static LARGE_INTEGER _frequency.QuadPart = 0ull;

але я все ще отримую помилки.

хтось знає чому?



Де ви (якщо десь) визначили WindowsTimer::_frequency ?
CB Bailey

@CharlesBailey Це мій єдиний учасник у класі.
какуш

Відповіді:


107

Вам потрібно визначити _frequencyу файлі .cpp.

тобто

LARGE_INTEGER WindowsTimer::_frequency;

Чому я повинен це робити так?
nowox

35

Linker не знає, куди розподілити дані, _frequencyі ви повинні повідомити їх вручну. Ви можете досягти цього, просто додавши цей рядок: LARGE_INTEGER WindowsTimer::_frequency = 0;в одне з ваших джерел на C ++.

Детальніше пояснення тут


29

За допомогою C ++ 17 ви можете оголосити свою змінну вбудованою , більше не потрібно її визначати у файлі cpp.

inline static LARGE_INTEGER _frequency;

Це призводить до помилкиerror: 'foobar' declared as an 'inline' field
Педро Енріке

3
NVM, я щойно оновив свій GCC через менеджер MinGW з 6.3 до 8.2, і він працює нормально.
Педро Енріке

24

Якщо всередині класу є статична змінна, тоді ви повинні визначити її у файлі cpp таким чином

LARGE_INTEGER WindowsTimer::_frequency = 0;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.