如何将模板类的容器的迭代器传递给函数
How to pass an iterator of a container of a template class to a function?
这是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工作)刚刚做了一个关于模板参数推导的小视频。虽然他没有明确谈论你的例子,但他确实涵盖了一些类似的情况,并对模板参数推导的作用进行了很好的概述
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 如何创建迭代器函数
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 使用迭代器的模板类的构造函数
- C++:复制迭代器的构造函数
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数中的迭代器出现问题
- 使用迭代器的自定义比较器函数
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 如何基于循环迭代器选择函数
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 具有C++迭代器参数的多功能函数
- C++如何获取传递给函数(STL 迭代器)的参数的名称
- C++ 对自定义映射迭代器函数的未定义引用