[Visual C++] クラスを他のクラスのメンバにすると C2079 エラー

この記事は3年以上前に書かれた記事です。情報が古い可能性があります。

VC++ で、例えば次のような書き方をしたとする。

class Test2;// 宣言
class Test1
{
  public:
    Test1();
    ~Test1();
    Test2 m_test2; // ← Test2 をメンバに持たせる。
};

class Test2
{
  public:
    Test2();
    ~Test2();
};

すると、

error C2079: ‘Test1::m_test2’ が 未定義の class ‘Test2’ で使用しています。

というコンパイルエラーになる。これは m_test2 を定義する時点で、まだ Test2 というクラスを認識できていないから(コンパイラはコード上から順番に読み込んでる)なので、

class Test2;// 宣言
class Test1
{
  public:
    Test1();
    ~Test1();
    Test2 *m_test2; // ← ポインタにする。
};

class Test2
{
  public:
    Test2();
    ~Test2();
};

とすればコンパイルは通る。ポインタであれば後から定義されたものでも認識するらしい。

もしくは、Test2 を Test1 より先に書いても良い。

参考:
コンパイラ エラー C2079

タイトルとURLをコピーしました