C++ 初心者の私がハマった罠なので、恐らく普段から C++ を書きまくってるベテラン C++er にとっては罠でもなんでもないかもしれないですが、些細なことでもいいので記録として残すことにしました。別にネタが欲しかったとかそういうんじゃないんだからね!
とあるところに、こんな感じのクラスがありました。
class Foo { public: enum Result { OK, NG, }; Result process() { return OK; } };
ここで、process() の処理が長くなったので宣言と定義を分けることにしました。
class Foo { public: enum Result { OK, NG, }; Result process(); }; Result Foo::process() { return OK; }
error: ‘Result’ does not name a type
…orz
わかってしまえばどうってことないんだけど、へっぽこC++er見習いの私は原因が中々わからず30分(推定)くらい悩みました…。
正解はこうですね。
class Foo { public: enum Result { OK, NG, }; Result process(); }; Foo::Result Foo::process() { return OK; }
前から思ってたんだけど、定義のたびに Foo:: って書くの面倒だし今回みたいなスコープの罠もあるし、定義の時にも class {} で囲って書きたいです…。
どうでもいいけど trap タグは今後も使って行きたい。