やあ子供たち、寒いね。先週はそうでもなかったけど今週はまた肌の表面が痛くなるような寒さだな。
今回は、ローカルクラスのお話だよ。ローカルクラスの意味は憶えてるかな。ローカルクラスとは関数内のコードブロックの中で定義されたクラスのことだよ。内部クラスとは違うから使い分けてくれ。
VisualStudioのC++コンパイラだと2005の時からでさえ、このローカルクラスを、テンプレート引数として使うことが普通に出来るよ。たとえばこんな感じ。
void dum_func( void ) { struct Func33 { bool operator()( const int a ) const { return a==1; } }; std::vector< int > l; // ‥ l.erase( remove_if( l.begin(), l.end(), Func33() ), l.end() );//←XCodeだと‥ return; }
しかし、これは現状最新のXCodeの標準コンパイラ(gcc-4.2.1)なんかだと「error: no matching function for call to 'remove_if(__gnu_cxx::__normal_iterator
調べてみると、C++0x以前の、いわゆるC++98やC++03と呼ばれるものにおいては、ローカルクラスをテンプレートの引数に指定することは許していないのだった。
なので、上のコードを、時代遅れのコンパイラでコンパイル通すためには以下のように書き直す必要があるよ。
struct Func33 { bool operator()( const int a ) const { return a==1; } }; void dum_func( void ) { std::vector< int > l; // ‥ l.erase( remove_if( l.begin(), l.end(), Func33() ), l.end() ); return; }
どうかな?アホくせー!とか思ってしまわないかい?でもこれが時代遅れのC++コンパイラの現状だ。
わかってしまえばそれだけのことなのだけど、エラーメッセージが分かりにくいから皆も憶えておいてほしい。それにしてもXCodeのgccのバージョンなんとかならんかのう!じゃ!