2008-11-12 60 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()