Я пытаюсь скомпилировать небольшой 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 определяется следующим образом:
bool less(MyClass& a, double b);
Я не понимаю, почему я получаю эту ошибку, иесли для этой ошибки есть веская причина, почему я получаю ее только в Debug (а не в Release)?DLL при компиляции в Release работает нормально и не падает.Кроме того, я проверил, и нет #ifdef DEBUG
или подобных вещей, которые могли бы изменить код, скомпилированный в отладке и в выпуске.
РЕДАКТИРОВАТЬ:
Я не писал кодя сам, и это алгоритм, о котором я не знаю много, поэтому я не знаю, что должно представлять двойное значение, и я не хочу менять логику внутри функции 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;
}
};
Редактировать:
Ответ MSalters показал, что реализации предикатов отладки и выпуска не были одинаковыми, что делало его компиляцией в выпуске, а не вотладка в моем случае (потому что код не очень аккуратный и не должен использовать функцию сравнения с 2 различными типами).Хак, который я сделал, чтобы иметь возможность использовать этот код в отладке, также заключался в том, чтобы поместить эту строку перед любыми включениями (обратите внимание, что предпочтительным решением должно быть улучшение функции сравнения, но в моем случае это было невозможно):
#define _HAS_ITERATOR_DEBUGGING 0