簡體   English   中英

c++ 在調試中編譯錯誤但在發布中沒有

[英]c++ compile error in debug but not in release

我正在嘗試編譯一個小的 COM dll (使用visual studio 2008 pro),它在發布時編譯得很好,但是當我嘗試在調試中編譯它時出現編譯錯誤:

錯誤 C2664:“bool (MyClass &, double)”:無法將參數 2 從“MyClass”轉換為“double”。

現在這個錯誤來自我執行此操作的代碼中的一行(注意 someValueThatIsADouble 是 double 類型):

std::vector<MyClass>::iterator iter = std::lower_bound(MyVector.begin(), MyVector.end(), someValueThatIsADouble, less);

而 less function 是這樣定義的:

bool less(MyClass& a, double b);

我不明白為什么我會收到這個錯誤,如果這個錯誤有充分的理由,為什么我只能在 Debug(而不是在 Release)中得到它? dll 在 Release 中編譯時運行良好且不會崩潰。 此外,我檢查並沒有#ifdef DEBUG或類似的東西可以更改在調試和發布中編譯的代碼。

編輯:

我自己沒有編寫代碼,這是一個我不太了解的算法,所以我不知道 double 值應該代表什么,我不想 go 將 less function 中的邏輯更改為將 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 的回答表明謂詞的調試和發布實現不一樣,這使得它在我的情況下在發布而不是在調試中編譯(因為代碼不是很整潔,不應該使用比較 function 與 2不同種類)。 為了能夠在調試中使用此代碼,我所做的 hack 也是將此行放在任何包含之前(請注意,首選解決方案應該是更好地比較 function,但在我的情況下這是不可能的):

#define _HAS_ITERATOR_DEBUGGING 0 

錯誤消息表明您正在使用 MSVC。 它的庫實現包含對謂詞的調試檢查。 特別是,對於偏序謂詞(例如您的less ),我認為它測試是否Pred(a,b) && Pred(b,a) == false 顯然這在這里行不通。

(謂詞的一個常見錯誤是人們習慣於定義一個順序,使得a<bb<a 。在這種情況下,有許多<algorithm>會崩潰,這就是為什么現在有一些調試檢查以防止此類錯誤。如果您實際上設法在運行時傳遞了一對錯誤a,b值,它們仍然只會捕獲錯誤;它們無法在編譯時捕獲理論錯誤)

嘗試:

bool less(const MyClass& a, const MyClass& b);
template<class ForwardIterator, class Type, class BinaryPredicate>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const Type& val, BinaryPredicate comp);

第一個:前向迭代器尋址要搜索的范圍內第一個元素的 position。

last:前向迭代器尋址 position 一個超過要搜索的范圍中的最后一個元素。

val:在有序范圍內搜索其第一個 position 或可能的第一個 position 的值。

comp:用戶定義的謂詞 function object 定義一個元素小於另一個元素的意義。 一個二元謂詞需要兩個 arguments,滿足時返回 true,不滿足時返回 false。

它在發布時編譯,因為在 std 的發布實現中禁用了一些檢查。 但它不應該編譯:val 應該是 MyClass 類型而不是 double 類型,然后 less 即使在發行版中也不會再編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM