3753817_s

静的メンバ変数を宣言した時に、コンパイルエラーが起きて
undefined reference to `Hogehoge::m_hogeNum'
といった感じに、宣言してたはずのメンバー変数が宣言していないとのエラーが発生しました。

本記事では、このエラーに対する対処方法をまとめていきます。




"undefined reference to"のエラーが出る場合のコード


以下のコードではをコンパイルすると冒頭で説明したように、「undefined reference to `Hogehoge::m_hogeNum'」というエラーメッセージが表示されます。


ソースコード

#include <iostream>

class Hogehoge{
public:
    Hogehoge(int num);
    ~Hogehoge();

private:
    static intm_hogeNum;
};

Hogehoge::Hogehoge(int num){
    m_hogeNum = &num;
}

Hogehoge::~Hogehoge(){}

int main(void){
    int x = 5;
    Hogehogehogehoge = new Hogehoge(5);

    return 0;
}



エラーメッセージ

undefined reference to `Hogehoge::m_hogeNum'
collect2.exe: error: ld returned 1 exit status



対策


調べてみると、staticメンバ変数も関数のように明示的にすることで"undefined reference"エラーを防ぐことができることが分かりました。

先ほど上記で紹介したコードを改造して、コンパイルがとおるようにしてみます。

#include <iostream>

class Hogehoge{
public:
    Hogehoge(int num);
    ~Hogehoge();

private:
    static intm_hogeNum;
};

int* Hogehoge::m_hogeNum = nullptr;

Hogehoge::Hogehoge(int num){
    m_hogeNum = &num;
}

Hogehoge::~Hogehoge(){}

int main(void){
    int x = 5;
    Hogehogehogehoge = new Hogehoge(5);

    return 0;
}

赤字にしている部分が先ほどのコードから追加した部分です。

intHogehoge::m_hogeNum = nullptr;

といった感じに明示的に宣言することで、"undefined reference"エラーを回避することができました。



まとめ


staticメンバ変数は、関数などとどうように明示的に定義しておく必要があることが分かりました。

久しぶりにC++を使ったりするとこういったくだらないミスで詰まってしまうことがありますので気をつけましょう。