2008-11-12 59 views
2

我刚刚将一个项目从Visual Studio 2003转换为2005,尽管它大部分'转换'正常,但我有一系列STL错误来自以下行:STL迁移问题(VS 2003 - > 2005)

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 

我看不出什么错码,它在2003年VS任何想法完美地工作?

+0

很奇怪,我想,似乎是在抱怨NULL作为默认值。 – kenny 2008-11-12 11:21:23

回答

10

你的程序是不正确的NULL不能转换为一个迭代。我不知道你希望这些迭代器被初始化为什么。如果您需要guarantied不是在一个容器,但到现在还“有效”的迭代器,你可以使用默认的构造函数:但是

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将无法以有意义的方式进行比较!只有从给定容器获得的迭代器才具有可比性。最后,我建议不要使用默认值itBeginitEnd。如果你真的不需要这些,就可以创建另一个没有参数的函数,并做一些有意义的事情。即:

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 

程序的另一个问题是使用向量来存储指针。这真的是不安全的。确保你永远不要从矢量中删除元素,而不要先删除元素。算法复制周围的对象也可能存在问题。向量中使用智能指针更好。

2

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

您可以使用默认构造的迭代器来代替:

std::vector<CSomeObject*>::iterator itBegin = std::vector<CSomeObject*>::iterator()