C++向量模板迭代器结束函数

问题描述 投票:0回答:2

我的任务是编写带有单独描述的模板向量。我想实现迭代器,但在 end() 函数中出现了一个奇怪的错误。

我有两个构造函数:

template <class T> Vector<T>::iterator::iterator(Vector<T>& v): vector(v), index(0){} template <class T> Vector<T>::iterator::iterator(Vector<T>& v, bool): vector(v), index(v.getSize()){}

以及begin()和end()的实现:

template <class T> typename Vector<T>::iterator Vector<T>::iterator::begin() { return iterator(*this); } template <class T> typename Vector<T>::iterator Vector<T>::iterator::end() { return iterator(*this, true); }

在 main() 中:

Vector<int>::iterator it(vec); for(Vector<int>::iterator start = it.begin(); start != it.end(); ++start) { std::cout << *start << std::endl; }

我有一个错误:

F:\Vector\vector.cpp:281: ошибка: no matching function for call to 'Vector<int>::iterator::iterator(Vector<int>::iterator&, bool)' return iterator(*this, true);

我好像没明白什么。怎么了?

c++ constructor iterator
2个回答
1
投票
这里:

template <class T> typename Vector<T>::iterator Vector<T>::iterator::begin() { return iterator(*this); } template <class T> typename Vector<T>::iterator Vector<T>::iterator::end() { return iterator(*this, true); }

您可以通过传递

*this

 来构造迭代器,但 
*this
 是对迭代器的引用。正如编译器所说,您没有定义任何将对迭代器的引用作为参数的迭代器构造函数。您的 2 个构造函数都引用向量(而不是迭代器)。
你应该这样做:

template <class T> typename Vector<T>::iterator Vector<T>::begin() { return iterator(*this); } template <class T> typename Vector<T>::iterator Vector<T>::end() { return iterator(*this, true); }

(我删除了

::iterator

,因为 
begin
end
 应该是向量的方法,而不是迭代器的)。现在 
*this
 将是对 
Vector<T>
 的引用。


0
投票
这个问题/答案对于理解如何在模板中创建迭代器非常有用。我已经扩展了使用 #define TEMPLATE_ITERATOR(T) typename std::vector<>::iterator

的答案

#define TEMPLATE_ITERATOR(T) typename std::vector<T>::iterator // Generic Vector management template<typename VANY_TYPE> class GENERIC_VECTOR_MANAGER { private: protected: GENERIC_VECTOR_MANAGER() {} ~GENERIC_VECTOR_MANAGER() {} public: std::vector<VANY_TYPE> vtype; // use the iterator type name as a function argument type name // difficult/imposible to use "auto arg_any_type_iter" here for the argument type name virtual bool Act_On_Iter(TEMPLATE_ITERATOR(VANY_TYPE) arg_any_type_iter) { // sample code, the derived class should have specific code // validate the iterator before using it if (vtype.empty()) { return false;} if (arg_any_type_iter == nullptr) { return false; } if (arg_any_type_iter < vtype.begin()) { return false; } if (arg_any_type_iter > vtype.end()) { return false; } // Act on arg_any_type_iter return true; } bool Loop_From_Begin_To_End() { if (vtype.empty()) { return false; } // use the iterator type name as a local variable type name // "auto a_iter = vtype.begin()" will work here also within the template for (TEMPLATE_ITERATOR(VANY_TYPE) a_iter = vtype.begin(); a_iter <= vtype.end(); ++a_iter) { if (!Act_On_Iter(a_iter)) { break; } } return true; } }; // class GENERIC_VECTOR_MANAGER
    
© www.soinside.com 2019 - 2024. All rights reserved.