gpt4 book ai didi

c++ - 迭代器 - vector::iterator 和 array::iterator 的重载函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:42 25 4
gpt4 key购买 nike

我只是想重载某个函数连续容器的迭代器(它们是 std::vector::iterator 、std::array::iterator 和内置数组迭代器 == 原始指针)可以是有效参数。

出于某种原因,我的函数无法针对 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,之后all, it is part of it/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
}

关于c++ - 迭代器 - vector::iterator 和 array::iterator 的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com