c ++在调试时编译错误,但在发布时没有

时间:2011-07-18 13:14:28

标签: c++ templates compiler-errors debug-mode

我正在尝试编译一个小的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);

以这种方式定义较少的函数:

bool less(MyClass& a, double b);

我不明白为什么会出现这个错误,如果这个错误有充分的理由,为什么我只能在Debug(而不是Release)中获取它?在发行版中编译时,该DLL运行正常并且不会崩溃。此外,我检查了没有#ifdef DEBUG或类似的东西,它们可以改变在debug和release中编译的代码。

编辑:

我自己没有编写代码,这是一个我不太了解的算法所以我不知道双重值应该代表什么,我不想改变内部的逻辑使用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的回答显示谓词的调试和发布实现不一样,这使得它在发行版中编译而在我的情况下不在调试中(因为代码不是很整齐,不应该使用比较功能有2种不同的类型)。我在调试中使用此代码所做的黑客操作也是在任何包含之前放置此行(请注意,首选解决方案应该是具有更好的比较功能,但在我的情况下它是不可能的):

#define _HAS_ITERATOR_DEBUGGING 0 

3 个答案:

答案 0 :(得分:2)

错误消息表明您正在使用MSVC。它的库实现包含对谓词的调试检查。特别是,对于偏序谓词(例如您的less),我认为它会测试Pred(a,b) && Pred(b,a) == false。显然这不会起作用。

(谓词的一个常见错误是人们过去常常定义a<bb<a的订单。在这种情况下有很多<algorithm>分解,这就是为什么现在有一些调试检查来防止这样的错误。如果你真的设法在运行时传递一对错误的a,b值,他们只能捕获错误;它们在编译时无法捕获理论错误)< / p>

答案 1 :(得分:1)

尝试:

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

答案 2 :(得分:1)

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

first:一个前向迭代器,用于寻找要搜索的范围中第一个元素的位置。

last:一个前向迭代器,用于寻找一个超出要搜索范围中最后一个元素的位置。

val:在有序范围内搜索其第一个位置或可能的第一个位置的值。

comp:用户定义的谓词函数对象,用于定义一个元素小于另一个元素的含义。二元谓词有两个参数,当满足时返回true,不满意时返回false。

它在发布中编译,因为某些检查在std的发布实现中被停用。但它不应该编译:val应该是MyClass类型而不是double类型,然后即使在发布中也不会再编译。