Ошибка компиляции C ++ в отладке, но не в выпуске - PullRequest
4 голосов
/ 18 июля 2011

Я пытаюсь скомпилировать небольшой 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 

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

В сообщении об ошибке предлагается использовать MSVC.Это реализация библиотеки содержит проверки отладки предикатов.В частности, для предиката частичного порядка (например, вашего less), я думаю, он проверяет, является ли Pred(a,b) && Pred(b,a) == false.Очевидно, что здесь это не сработает.

(Одна из распространенных ошибок с предикатами заключается в том, что люди использовали для определения порядка так, что и a<b, и b<a. Есть много <algorithm> св этом случае, поэтому сейчас есть некоторые отладочные проверки для предотвращения таких ошибок, но они перехватывают ошибки только в том случае, если вам действительно удается передать пару плохих значений a,b во время выполнения, они не могут отловить теоретические ошибки при компиляциивремя)

1 голос
/ 18 июля 2011
template<class ForwardIterator, class Type, class BinaryPredicate>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const Type& val, BinaryPredicate comp);

first: прямой итератор, указывающий на позицию первого элемента в диапазоне, который нужно найти.

last: прямой итератор, указывающий на позицию после последнего элемента в диапазоне, в котором нужно искать..

val: значение, в котором первая или возможная первая позиция ищется в упорядоченном диапазоне.

comp: объект пользовательской функции предиката, который определяет смысл, в котором один элемент меньшечем другой.Бинарный предикат принимает два аргумента и возвращает истину, когда выполнено, и ложь, если не удовлетворен.

Он компилируется в релизе, потому что некоторые проверки деактивируются в реализации выпуска std.Но он не должен компилироваться: val должен иметь тип MyClass, а не тип double, и тогда less не будет компилироваться даже в выпуске.

1 голос
/ 18 июля 2011

Попробуйте с:

bool less(const MyClass& a, const MyClass& b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...