2011-07-18 48 views
4

我想編譯一個小的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 
+0

如果你在所有常量函數中加了const,那會很好。 –

回答

2

該錯誤信息顯示您正在使用MSVC。它的庫實現包含對謂詞的調試檢查。特別是,對於部分訂單謂詞(例如您的less),我認爲它測試是否Pred(a,b) && Pred(b,a) == false。顯然,這不會在這裏工作。

(一個謂詞常見的錯誤是人們用來定義,使得兩個a<bb<a。有許多<algorithm> s表示在這種情況下,分解訂單,這就是爲什麼現在有一些調試檢查,以防止。這樣的錯誤,他們仍然只發現錯誤,如果你真的可以通過一對在運行時壞a,b值;他們不能趕在編譯時錯誤理論)

+0

嗯,這是非常可能的,謝謝!那麼是否有某種方式(可能是黑客),我可以使用提供的代碼在調試中構建它,或者我必須絕對嘗試找出如何編寫正確的運算符? – Carl

+1

這應該永遠不會工作,因爲每當a = b時它將評估爲false。但是,也許它測試像Pred(a,b)=>!Pred(b,b) –

+0

STL錯誤檢查旨在查找類似您的錯誤;你可以把它關掉。詳情請參閱MSDN。 (調試和發佈實際上只是預定義的選項集,通常可以調整它們,例如大多數專業人員也可以構建用於發佈版本的.PDB文件) – MSalters

1

嘗試:

bool less(const MyClass& a, const MyClass& b); 
+0

我應該提到我不想改變較少的功能。剛編輯我的問題。 – Carl

+0

提供給lower_bound調用的less函數用於比較給定集合的兩個項目:由於集合是MyClass的集合,因此less函數必須對兩個MyClass實例進行引用。你能否提供MyClass的聲明,也許有一些特定的操作符定義在它上面。 – rlods

+0

那是我最初的想法,但如果是這樣,爲什麼它在發佈模式下編譯? – Carl

1
template<class ForwardIterator, class Type, class BinaryPredicate> 
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const Type& val, BinaryPredicate comp); 

第一:一個前向迭代處理的位置要搜索範圍中的第一個元素。 last:一個前向迭代器,用於尋址位於待搜索範圍內最後一個元素後面的位置。

val:在有序範圍內搜索其第一個位置或可能的第一個位置的值。

comp:用戶定義的謂詞函數對象,用於定義其中一個元素小於另一個元素的意義。二元謂詞有兩個參數,滿足時返回true,不滿足時返回false。

它在發佈時編譯,因爲在std的發佈實現中取消了一些檢查。但它不應該編譯:val應該是MyClass類型,而不是double類型,即使在發佈版本中,也不會再編譯。

相關問題