1

在我的头文件中,我有

template <typename T>
class Vector {
   public:
       typedef T* iterator;
       typedef const T* const_iterator;

       Vector(const_iterator start, const_iterator end);

       // other stuff ...

}

在 .cpp 文件中我有

template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : theSize( 0 ), theCapacity( 1 )
{
    array = new T[ theCapacity ];
    typename Vector< T >::iterator itr = start; // this is line 29
    for( iterator itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

但是编译器告诉我

Vector.cpp:29: error: invalid conversion from ‘const int*’ to ‘int*’

如何在将参数保留为 const_iterator 的同时解决此问题?

注意:如果它有帮助,我会尝试在开始和结束之间使用来自另一个 Vector 的元素构建一个 Vector。

4

4 回答 4

2

我也没有看到不在const_iterator循环中使用的原因。此外,您的push_back函数不应接受迭代器,而应接受值。

因此,我将相关部分重写如下:

typename Vector< T >::const_iterator itr = start;
for(const_iterator itr = start; itr != end; itr++ ){
    push_back(*itr);
}
于 2013-02-14T23:03:33.950 回答
0

你应该做push_back(*itr)而不是push_back(itr),这将解决你的问题

于 2013-02-14T23:05:47.100 回答
0

for 循环只需要使用一个 const_iterator。迭代器的 const-ness 仅适用于它的值,它仍然可以递增。你也可以使用你已经拥有的。

Vector(const_iterator pos, const_iterator end)
{
    for( ; pos != end; pos++ ){
        push_back( *pos );
    }
}
于 2013-02-14T23:40:59.740 回答
0

正如安迪所说,您需要一个 const 迭代器。如果您的编译器支持 C++11,您的代码将变为:

template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : 
theSize( 0 ), 
theCapacity( 1 )
{
    array = new T[ theCapacity ];
    for( auto itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

我还要问:你确定要手动滚动你自己的 Vector 吗?你有充分的理由不使用 std::vector 吗?

于 2013-02-15T00:16:01.773 回答