迭代器 - vector::itrator 和 array::iterator 的重载函数
Iterators - Overloading functions for vector::iterator and array::iterator
我正在尝试重载某个函数,所以只有连续容器的迭代器(std::vector::iterator ,std::array::iterator 和内置数组迭代器 == 原始指针)可以是有效的参数。
由于某种原因,我的函数无法为向量和 std::array 编译:
功能:
template <class T,size_t N>
void catchIterator(typename std::array<T, N>::iterator it) {
//do somthing
}
template <class T>
void catchIterator(typename std::vector<T>::iterator it) {
//do somthing
}
使用示例 :
std::array<int, 10> arr;
auto it = arr.begin();
catchIterator(it);
std::vector<int> vec;
auto it0 = vec.begin();
catchIterator(it0);
错误:
Error (active) no instance of overloaded function "catchIterator" matches the argument list
Error (active) no instance of overloaded function "catchIterator" matches the argument list
Error C2783 'void catchIterator(std::array<_Ty,_Size>::iterator)': could not deduce template argument for 'T'
Error C2783 'void catchIterator(std::array<_Ty,_Size>::iterator)': could not deduce template argument for 'N'
Error C2672 'catchIterator': no matching overloaded function found
我正在使用VC++和Visual studio 2015 RTM。
这些错误是不言自明的,但我想知道是否编译器无法真正从它和 it0 中推断出 T 和 N,之后所有,它是它/it0类型的一部分。
如何使其工作?
编辑:
我将接受@ForEveR建议,并将容器+迭代器/索引作为参数传递。谢谢!
你的函数不能工作,因为编译器无法从迭代器中推断出你发送到函数的T
和N
。您可以使用std::enable_if
.
template <class Iterator>
typename std::enable_if<std::is_same<Iterator, typename std::array<typename std::iterator_traits<Iterator>::value_type, 1>::iterator>::value, void>::type
catchIterator(Iterator it) {
//do somthing
}
template <class Iterator>
typename std::enable_if<std::is_same<Iterator, typename std::vector<typename std::iterator_traits<Iterator>::value_type>::iterator>::value, void>::type
catchIterator(Iterator it) {
//do somthing
}
但是如果vector::iterator
和array::iterator
是同一类型(例如在gcc上),实际上存在一个问题 - 代码将无法编译,因为编译器不知道它应该使用哪个函数。
最好的方法是将容器作为第一个参数传递,将迭代器作为第二个参数传递。
template <typename T, size_t N>
void catchIterator(const std::array<T, N> &, typename std::array<T, N>::iterator it) {
//do somthing
}
template <typename T>
void catchIterator(const std::vector<T> &, typename std::vector<T>::iterator) {
//do somthing
}
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 迭代器 - vector::itrator 和 array::iterator 的重载函数