繁体   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