我想編譯一個小的COM DLL(使用Visual Studio 2008專業版),它在編譯罰款釋放,但是當我嘗試在調試編譯它我得到一個彙編錯誤:C++編譯錯誤在調試但不在發佈
error C2664: 'bool (MyClass &, double)': cannot convert parameter 2 from 'MyClass' to 'double'.
現在,這個錯誤來自在我這樣做的代碼行(注意someValueThatIsADouble是雙精度型):
std::vector<MyClass>::iterator iter = std::lower_bound(MyVector.begin(), MyVector.end(), someValueThatIsADouble, less);
和不太函數的定義是這樣的:
bool less(MyClass& a, double b);
我不明白爲什麼我會得到這個錯誤,如果這個錯誤有一個很好的原因,爲什麼我只在調試(而不是在發佈)中得到它?當在Release中編譯時,dll運行正常,不會崩潰。此外,我檢查了並沒有#ifdef DEBUG
或類似的東西,這可能會改變在調試和發佈中編譯的代碼。
編輯:
我沒有寫代碼自己和它的算法,我不很瞭解,所以我不知道什麼是雙重價值應該代表我不想去更少的函數內部的邏輯取一個MyClass而不是一個double作爲第二個參數。
class MyClass
{
public :
MyClass(): _dValue1(0.0),_dValue2(0.0),_dValue3(0.0)
{
}
MyClass(double dValue1, double dValue3, double dValue2): _dValue2(dValue2),_dValue3(dValue3),_dValue1(dValue1)
{
}
~MyClass() {}
double getValue1() {return _dValue1;}
double getValue3() {return _dValue3;}
double getValue2() {return _dValue2;}
double _dValue1;
double _dValue3;
double _dValue2;
public:
friend class vector<MyClass>;
int compare(const MyClass & t1, const MyClass & t2)
{
if (t1._dValue1 < t2._dValue1)
return -1;
else if (t2._dValue1 < t1._dValue1)
return 1;
else
return 0;
}
bool operator> (const MyClass & rhs)
{
if ( _dValue1 > rhs._dValue1)
return true;
else
return false;
}
bool operator< (const MyClass & rhs)
{
if ( _dValue1 < rhs._dValue1)
return true;
else
return false;
}
};
編輯:
MSalters的回答表明,調試和發佈的謂詞的實現是不一樣的,這使得它在發佈編譯,而不是在調試在我的情況(因爲代碼ISN非常整潔,不應該使用兩種不同類型的比較函數)。在調試中我能夠使用這個代碼的黑客也是把這行放在任何包含之前(注意,首選解決方案應該是有更好的比較功能,但在我的情況下是不可能的):
#define _HAS_ITERATOR_DEBUGGING 0
如果你在所有常量函數中加了const,那會很好。 –