LoginSignup
7
3

More than 3 years have passed since last update.

相互includeが上手くいかない(C++)

Posted at

どういうわけか"does not name a type"

今日ハマった話。こういうのは「そりゃそうだ!」という結論が待ってます。

きちんとincludeして、多重も避けているのに"does not name a type"になってしまうのは何故だ

hoge.h

#include "pugya.h"
class Hoge
{
    Pugya pu;
    void func(void);
};

pugya.h

#include "hoge.h"
class Pugya
{
    using HogeFunction = void(Hoge::*)(void);
};

このような相互関係のあるクラスを作り相互にincludeさせようとすると上手くいきません。 もちろん多重includeを避けるロジックは入れておきます。
気付けば当たり前だけど片側のソースコードのみを見ていると全く分からないこの問題。

hoge.cppをコンパイルするときに、まずhoge.hをincludeして、その中からpugya.hをincludeしますよね。するとpugya.hからhoge.hはincludeされないわけです。class Pugyaの定義を開くときにHogeは未定義(未宣言)になっている、というのが答えでした。

従って解決策は、プロトタイプで済む方の#includeを止め、プロトタイプ宣言にする、です。

pugya.h

class Hoge;    // プロトタイプ宣言
class Pugya
{
    using HogeFunction = void(Hoge::*)(void);
};

気付いたときの脱力感がすごかった...

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3