2

我刚刚将一个项目从 Visual Studio 2003 转换为 2005,尽管其中大部分都“转换”得很好,但以下行出现了一系列 STL 错误:

void SomeFn( std::vector<CSomeObject*>::iterator it,
std::vector<CSomeObject*>::iterator itBegin = NULL,
std::vector<CSomeObject*>::iterator itEnd = NULL );

Visual Studio 错误如下:

c:\<path>\Headerfile.h(20) : error C2440: 'default argument' : cannot convert from 'int' to 'std::_Vector_iterator<_Ty,_Alloc>'
        with
        [
            _Ty=CObject *,
            _Alloc=std::allocator<CObject *>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous

我看不出该代码有什么问题,它在 VS 2003 中运行良好。有什么想法吗?

4

2 回答 2

11

您的程序不正确,因为 NULL 无法转换为迭代器。我真的不知道您希望将这些迭代器初始化为什么。如果您需要一个保证不在容器中但仍然“有效”的迭代器,您可以使用默认构造函数:

typedef std::vector<CSomeObject*> myvector_t;
void SomeFn( myvector_t::iterator it,
             myvector_t::iterator itBegin = myvector_t::iterator(),
             myvector_t::iterator itEnd = myvector_t::iterator() );

但是请注意,如果您这样做ititBeginitEnd将无法以有意义的方式进行比较!只有从给定容器获得的迭代器才有意义。最后,我建议不要对itBegin和使用默认值itEnd。如果您真的不需要这些,请创建另一个不带参数的函数并做一些有意义的事情。IE:

typedef std::vector<CSomeObject*> myvector_t;
void SomeFn( myvector_t::iterator it,
             myvector_t::iterator itBegin,
             myvector_t::iterator itEnd );
void SomeFn( myvector_t::iterator it ); // No begin/end arguments

您的程序的另一个问题是使用向量来存储指针。这真的很不安全。确保在没有先删除元素的情况下从向量中删除元素。您可能还会遇到算法复制对象的问题。最好在向量中使用智能指针。

于 2008-11-12T11:42:10.677 回答
2

2003年,std::vector<T>::iterator刚刚T *。在 2005 年,至少在调试模式下,它是一个类,因此您不能使用NULL它的值(NULL解析为0)。

您可以改用默认构造的迭代器:

std::vector<CSomeObject*>::iterator itBegin = std::vector<CSomeObject*>::iterator()
于 2008-11-12T11:25:49.290 回答