我只是试图超载某个功能 连续容器的迭代器 (std :: vector :: iterator,std :: array :: iterator和内置数组iterators == raw pointers)可以是有效参数。
由于某种原因我的函数无法编译为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 ++。
这些错误很明显,但我不知道是不是 编译器无法真正推断出它和它之后的T和N. 所有,它是它/ it0类型的一部分..
怎样才能让它发挥作用?
修改
我将使用@ForEveR建议并将容器+迭代器/索引作为参数传递。
谢谢!
答案 0 :(得分:4)
您的函数无法工作,因为编译器无法从迭代器推导出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上),实际上存在问题 - 代码将无法编译,因为编译器不知道它应该使用哪个函数。 / p>
最好的方法是将容器作为第一个参数传递,将迭代器作为第二个参数传递。
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
}