如何将模板类的容器的迭代器传递给函数

How to pass an iterator of a container of a template class to a function?

本文关键字:迭代器 函数      更新时间:2023-10-16

这是James对这个问题的回答:平坦迭代器

我尝试更改James的解决方案,使其能够处理模板类。事实证明,我在调用函数时陷入了困境(这里是"flat",这里是"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)

这些是依赖类型参数,编译器无法解析它们,例如:模板类中具有依赖类型参数的模板函数

您可以使用http://en.cppreference.com/w/cpp/types/enable_if并使用某种类型特征模板。

模板提取指南

模板参数推导适用于许多情况,但它的作用是有限的。您已经达到了其中一个极限。

Stephan Lavavej(目前在微软的STL工作)刚刚做了一个关于模板参数推导的小视频。虽然他没有明确谈论你的例子,但他确实涵盖了一些类似的情况,并对模板参数推导的作用进行了很好的概述