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

なんか短くなっただけって感じ。