web-dev-qa-db-ja.com

静的メンバーへの未定義の参照

クロスコンパイラを使用しています。私のコードは:

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

次のエラーが表示されます。

「WindowsTimer :: _ frequency」への未定義の参照

私もそれを変更しようとしました

LARGE_INTEGER _frequency.QuadPart = 0ull;

または

static LARGE_INTEGER _frequency.QuadPart = 0ull;

それでもエラーが発生します。

誰もが理由を知っていますか?

66
kakush

.cppファイルで_frequencyを定義する必要があります。

つまり.

LARGE_INTEGER WindowsTimer::_frequency;
83
Ed Heal

リンカは、_frequencyのデータをどこに割り当てるかを知らないため、手動でデータを伝える必要があります。これを実現するには、次の行を追加します:LARGE_INTEGER WindowsTimer::_frequency = 0;をC++ソースの1つに追加します。

より詳細な説明 こちら

27
Vyktor

クラス内で宣言された静的変数がある場合は、次のようにcppファイルで定義する必要があります

LARGE_INTEGER WindowsTimer::_frequency = 0;
18
Raghuram

C++ 17を使用すると、変数 inline を宣言でき、cppファイルで変数を定義する必要がなくなります。

inline static LARGE_INTEGER _frequency;
7
Zhenxiao Hao