繁体   English   中英

迭代器 - 为vector :: iterator和array :: iterator重载函数

[英]Iterators - Overloading functions for vector::iterator and array::iterator

我正在尝试重载某个函数,因此只有连续容器的迭代器(std :: vector :: iterator,std :: array :: iterator和内置数组iterators == raw指针)才能成为有效参数。

由于某种原因,我的函数无法为vector和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  

我在Visual Studio 2015 RTM中使用VC ++。

错误是非常明显的,但我想知道编译器是否真的不能从它和it0推断出T和N,毕竟它是它/ it0类型的一部分..

怎么能让它起作用?

编辑:
我将使用@ForEveR建议并将容器+迭代器/索引作为参数传递。 谢谢!

你的函数不能工作,因为编译器不能从迭代器推导出你发送给函数的TN 您可以使用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::iteratorarray::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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM