调试中出现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);
较少的函数是这样定义的:
bool less(MyClass& a, double b);
我不明白为什么我会出现这个错误,如果这个错误有充分的原因,为什么我只在调试中得到它(而不是在发布中(?dll在Release中编译时运行良好,不会崩溃。此外,我检查了一下,没有#ifdef DEBUG
或类似的东西可以更改在调试和发布中编译的代码。
编辑:
我不是自己写代码的,这是一个我不太了解的算法,所以我不知道double值应该代表什么,我也不想改变less函数内部的逻辑,将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;
}
};
编辑:
MSchangers的回答表明,谓词的调试和发布实现不相同,这使得它在发布时编译,而在我的情况下不在调试中编译(因为代码不是很整洁,不应该使用具有两种不同类型的比较函数(。为了能够在调试中使用此代码,我所做的破解也是将这一行放在任何include之前(注意,首选的解决方案应该是具有更好的比较功能,但在我的情况下这是不可能的(:
#define _HAS_ITERATOR_DEBUGGING 0
错误消息表明您正在使用MSVC。它的库实现包含对谓词的调试检查。特别是,对于偏序谓词(例如您的less
(,我认为它测试的是Pred(a,b) && Pred(b,a) == false
。显然这在这里行不通。
(谓词的一个常见错误是,人们过去常常定义一个顺序,即a<b
和b<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);
first:前向迭代器,寻址要搜索的范围中第一个元素的位置。
最后:一个正向迭代器,寻址要搜索的范围中最后一个元素之后的位置。
val:在有序范围内搜索其第一个位置或可能的第一个位置的值。
comp:用户定义的谓词函数对象,定义一个元素小于另一个元素的意义。二元谓词接受两个参数,满足时返回true,不满足时返回false。
它在发行版中编译,因为在std的发行版实现中,一些检查被停用。但它不应该编译:val应该是MyClass类型,而不是double类型,然后less即使在发行版也不会再编译。
- 为什么我在使用void函数时得到错误代码C2276
- 在cygwin中运行c++脚本时发生错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- posix_spawn():使用posix_scawn()时的错误处理问题
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 以只读模式打开数据库时SQLITE_CANTOPEN错误
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 标头,包括在 Swift 项目中使用C++文件时的错误
- 当我尝试通过构造函数分配 char 数组时出现错误
- 包含在 <WinSock2> Visual Studio 2015 中时出现错误
- 我在 ndk 中构建文件时遇到错误 android.mk
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 构建 Tensorflow 调试时出现错误LNK2019
- C++ 将元素分配给映射值时访问错误
- 使用动态数组时C++逻辑错误
- 当我在x64bit模式下编译MFC应用程序时,错误lnk2019未解析符号sqlite3_open,在win32模式下没
- C ++没有名为XY的成员,我在使用枚举时遇到错误