C++ の罠にハマった話

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 タグは今後も使って行きたい。