Следующий код не компилируется в C ++ Builder 2009 или Visual C ++ 2005, когда макрос _HAS_ITERATOR_DEBUGGING
равен 1
, но если закомментирован, он будет. Похоже, что функция lower_bound
не соответствует спецификации. Библиотека меняет аргументы. Вот выдержка из спецификации. value
всегда должен быть вторым аргументом. Я не прав?
ПРИМЕЧАНИЕ. Тестовый код не предназначен для запуска. Он был разработан, чтобы проиллюстрировать ошибку библиотеки.
C ++ Spec выдержка
template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value,
Compare comp);
25.3.3.1.3
Возвращает: Самый дальний итератор i в диапазоне [first, last] такой, что для любого итератора j в диапазоне [first, i) выполняются следующие соответствующие условия: * j
Сообщение об ошибке Visual Studio
Сообщение: ошибка C2664: «double mike :: operator () (const double, const char *) const»: невозможно преобразовать параметр 1 из «const char [1]» в «const double»
Файл: c: \ program files \ microsoft visual studio 8 \ vc \ include \ xutility
Строка №: 314
Тестовый код
#define _HAS_ITERATOR_DEBUGGING 1 // needs to be in the stdafx.h file for Visual Studio
#include "stdafx.h"
#include <algorithm>
#include <functional>
struct mike : public std::binary_function<double, char*, double> {
double operator() (const double i, const char*) const {
return i;
}
};
int main()
{
double r[] = {0};
std::lower_bound(r, r, "", mike());
return 0;
}