我的任务是编写带有单独描述的模板向量。我想实现迭代器,但在 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);
我好像没明白什么。怎么了?
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>
的引用。
的答案
#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