这是 James 对这个问题的回答的后续行动:Flattening iterator
我尝试更改 James 的解决方案,以便它可以处理模板类。原来我在调用函数时卡住了(那里是“flatten”,这里是“foo”)。当我专门针对每个模板参数时它起作用了,这是可能的,因为只有三个 (1,2,3) 会发生。一般情况不编译。请参阅下面的代码和 gcc 的错误消息。
#include <iterator>
#include <vector>
template <int I>
class A{};
template <int I>
void foo( typename std::vector< A <I> >::iterator first ,
typename std::vector< A <I> >::iterator last) {}
//void foo( typename std::vector< A <1> >::iterator first ,
// typename std::vector< A <1> >::iterator last) {} // this works
int main()
{
std::vector< A<1> > v;
foo(v.begin(),v.end());
return 0;
}
使用 gcc 4.6.3 编译后的错误消息:
test_templ_func.cc: In function ‘int main()’:
test_templ_func.cc:15:24: error: no matching function for call to ‘foo(std::vector<A<1> >::iterator, std::vector<A<1> >::iterator)’
test_templ_func.cc:15:24: note: candidate is:
test_templ_func.cc:8:6: note: template<int I> void foo(typename std::vector<A<I> >::iterator, typename std::vector<A<I> >::iterator)