我正在尝试编译一个小的COM dll(使用Visual Studio 2008 Pro),在发布版中编译很好,但是当我尝试在调试模式下编译它时,出现了编译错误:
错误C2664:'bool(MyClass&,double)':无法将参数2从'MyClass'转换为'double'。
现在,这个错误来自代码中的一行,我在这里执行以下操作(请注意,someValueThatIsADouble是double类型):
我不明白为什么会出现这个错误,如果这个错误有一个很好的原因,那么为什么我只在Debug(而不是Release中)看到了它?当在Release中编译时,dll可以正常运行且没有崩溃。此外,我检查过了,没有
错误C2664:'bool(MyClass&,double)':无法将参数2从'MyClass'转换为'double'。
现在,这个错误来自代码中的一行,我在这里执行以下操作(请注意,someValueThatIsADouble是double类型):
std::vector<MyClass>::iterator iter = std::lower_bound(MyVector.begin(), MyVector.end(), someValueThatIsADouble, less);
而 less 函数的定义如下:
bool less(MyClass& a, double b);
我不明白为什么会出现这个错误,如果这个错误有一个很好的原因,那么为什么我只在Debug(而不是Release中)看到了它?当在Release中编译时,dll可以正常运行且没有崩溃。此外,我检查过了,没有
#ifdef DEBUG
或其他能够更改在debug和release中编译的代码的东西。
编辑:
这段代码不是我自己写的,这是一个我不太了解的算法,所以我不知道double值应该代表什么,并且我不想改变less函数内部的逻辑来接收MyClass作为第二个参数。
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种不同类型的比较函数)。我为了能够在调试中使用此代码所做的hack也是在任何包含之前放置此行(请注意,首选解决方案应该是拥有更好的比较函数,但在我的情况下不可能):
#define _HAS_ITERATOR_DEBUGGING 0