typename忘れ
VC++で使ってたファイルにこんなのがあった。
template <class _C, class _f> _C& apply_vertex_all(_C vobj, _f func) { _C *ret = new _C(); for (_C::iterator i = vobj.begin(); i != vobj.end(); i++) ret->push_back(func(*i)); return *ret; }
C++に詳しい方からは速効でお叱りを受けそうだが、その前にsolarisのg++に激しくイミフなお言葉でお叱られた。
generate_patch.cpp: In function ‘_C& apply_vertex_all(_C, _f)’: generate_patch.cpp:150: error: expected `;' before ‘i’ generate_patch.cpp:150: error: ‘i’ was not declared in this scope generate_patch.cpp: In function ‘_C& apply_vertex_all(_C, _f) [with _C = std::vector<int, std::allocator<int> >, _f = Double<int>]’: generate_patch.cpp:170: instantiated from here generate_patch.cpp:150: error: dependent-name ‘_C::iterator’ is parsed as a non-type, but instantiation yields a type generate_patch.cpp:150: note: say ‘typename _C::iterator’ if a type is meant make: *** [generate_patch] エラー 1
_C::iterator の前の typename 忘れっす。というかVC++ってこれをうまく型名だと判断してしまうのか。。。変なところで賢いなあ。
なんかこういうところたくさんありそうな悪寒。それにしてもSTLのエラーって宇宙語だ。辛くなってSTLFilt噛ましてみたんだけど、
generate_patch.cpp: In function ‘_C & apply_vertex_all(_C, _f)’: generate_patch.cpp:150: error: expected `;' before ‘i’ generate_patch.cpp:150: error: ‘i’ was not declared in this scope generate_patch.cpp: In function ‘vector<int> & apply_vertex_all( vector<int>, Double<int>)’: generate_patch.cpp:150: error: dependent-name ‘_C::iter’ is parsed as a non-type, but instantiation yields a type generate_patch.cpp:150: say ‘_C::iter’ if a type is meant make: *** [generate_patch] エラー 1
なんか短くなっただけって感じ。