どういうわけか"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);
};
気付いたときの脱力感がすごかった...