Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 14.12.2006, 14:37   #1
Неактивный пользователь
 
Регистрация: 14.12.2006
Сообщений: 5
Репутация: 1
По умолчанию MSVS2005 - error, BDS2006 - ok

Цитата:
class Team
{
std::string name;
//...
}

//using
std::vector<Team>::iterator iter = std::find_if(teams.begin(), teams.end(), boost::bind(&Team::name, _1) == name);

//error
Error 1 error C2440: 'initializing' : cannot convert from 'std::_Vector_const_iterator<_Ty,_Alloc>' to 'std::_Vector_iterator<_Ty,_Alloc>' e:\my documents\visual studio 2005\projects\toto\toto\engine.cpp 21

Вопрос: почему в VS2005 вектор возвращает константный итератор, teams.begin(), тогда как bds2006 делает всё правильно.
13akaEagle вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: стоимость сервералайф арена одинцово официальный сайт - RedKassa.ruАддитивная 3D печатькатышев сергей кинотвкруиз на теплоходе казань-москва-казань


Старый 15.12.2006, 09:09   #2
kvm
Неактивный пользователь
 
Аватар для kvm
 
Пол:Мужской
Регистрация: 09.12.2006
Адрес: Москва.
Сообщений: 39
Репутация: 19
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

А как это вообще может работать?
Имеется ввиду последний аргумент, который имеет тип bool
boost::bind(&Team::name, _1) == name
__________________
Хочешь быть счастливым - будь им! (с) Козьма Прутков.
Ностальгия — это попытка сравнить наихудшее из настоящего с наилучшим из прошлого. (c) ?
kvm вне форума
 
Ответить с цитированием Вверх
Старый 15.12.2006, 16:12   #3
13akaEagle
Неактивный пользователь
 
Регистрация: 14.12.2006
Сообщений: 5
Репутация: 1
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

из msdn
Цитата:
Locates the position of the first occurrence of an element in a range that satisfies a specified condition.


template<class InputIterator, class Predicate>
InputIterator find_if(
InputIterator _First,
InputIterator _Last,
Predicate _Pred
);


Parameters
_First
An input iterator addressing the position of the first element in the range to be searched.

_Last
An input iterator addressing the position one past the final element in the range to be searched.

_Pred
User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.

Как оказалось до версии буста 1.33 такое было невозможно из-за того, что небылыли перегружены операторы сравнения, отрицания и т.д.
13akaEagle вне форума
 
Ответить с цитированием Вверх
Старый 16.12.2006, 14:43   #4
kvm
Неактивный пользователь
 
Аватар для kvm
 
Пол:Мужской
Регистрация: 09.12.2006
Адрес: Москва.
Сообщений: 39
Репутация: 19
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

Цитата:
Сообщение от 13akaEagle Посмотреть сообщение
Как оказалось до версии буста 1.33 такое было невозможно из-за того, что небылыли перегружены операторы сравнения, отрицания и т.д.

_Pred
User-defined predicate function object that defines the condition to be satisfied by the element being searched for. A predicate takes single argument and returns true or false.

Действительно функция-предикат должна возвращать значение true или false. Но в приведенном выше коде, третьим параметром является адрес временной переменной (результата сравнения функции, сконструированной boost::bind и переменной name). Отсюда следствие, что если это компилируется в BSD, то компилятор преобразовывает тип "адрес булевской переменной" к адресу якобы функции-предиката. Вот это и непонятно.

К тому же изначальный вопрос:
"почему в VS2005 вектор возвращает константный итератор, teams.begin(), тогда как bds2006 делает всё правильно"
вообще неясен, не может быть такой ошибки, так как реализация STL от Microsoft содержит два варианта функции begin() для вектора: первая возвращает просто итератор, вторая - константный.
__________________
Хочешь быть счастливым - будь им! (с) Козьма Прутков.
Ностальгия — это попытка сравнить наихудшее из настоящего с наилучшим из прошлого. (c) ?
kvm вне форума
 
Ответить с цитированием Вверх
Старый 16.12.2006, 15:46   #5
13akaEagle
Неактивный пользователь
 
Регистрация: 14.12.2006
Сообщений: 5
Репутация: 1
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

Цитата:
Сообщение от kvm Посмотреть сообщение
Действительно функция-предикат должна возвращать значение true или false. Но в приведенном выше коде, третьим параметром является адрес временной переменной (результата сравнения функции, сконструированной boost::bind и переменной name). Отсюда следствие, что если это компилируется в BSD, то компилятор преобразовывает тип "адрес булевской переменной" к адресу якобы функции-предиката. Вот это и непонятно.

На сколько я понял.
boost::bind(&Team::name, _1) == name
bind возвращает функциональный объект с перегруженным оператором ==, вот его адрес и передаётся в качестве предиката.

Цитата:
Сообщение от kvm Посмотреть сообщение
К тому же изначальный вопрос:
"почему в VS2005 вектор возвращает константный итератор, teams.begin(), тогда как bds2006 делает всё правильно"
вообще неясен, не может быть такой ошибки, так как реализация STL от Microsoft содержит два варианта функции begin() для вектора: первая возвращает просто итератор, вторая - константный.

Насчёт этих итераторов я в курсе.
Не поверишь, но даже вот такой код
std::vector<Team>::iterator first = teams.begin()
не хочет выполнятся, появляется эта ошибка.
Хотя в другом cpp этого же проекта всё прекрасно. Какие-то странности в MSVS2005. Но вот как это победить?
13akaEagle вне форума
 
Ответить с цитированием Вверх
Старый 17.12.2006, 09:06   #6
13akaEagle
Неактивный пользователь
 
Регистрация: 14.12.2006
Сообщений: 5
Репутация: 1
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

Цитата:
std::vector<Team>::iterator TeamList::TeamByName(const std::string& name) const
{
std::vector<Team>::iterator iter = std::find_if<std::vector<Team>::iterator>(teams.be gin(), teams.end(), boost::bind(&Team::name, _1) == name);
if (iter == teams.end()) throw "bad_name_of_team";
return iter;
}

Проблема решена. Совсем забыл, что константность функции подразумевает запрет модификации this.

ЗЫ: А на bds я видимо забыл установить константность.
13akaEagle вне форума
 
Ответить с цитированием Вверх
Старый 17.12.2006, 18:18   #7
kvm
Неактивный пользователь
 
Аватар для kvm
 
Пол:Мужской
Регистрация: 09.12.2006
Адрес: Москва.
Сообщений: 39
Репутация: 19
По умолчанию Re: MSVS2005 - error, BDS2006 - ok

Цитата:
Сообщение от 13akaEagle Посмотреть сообщение
bind возвращает функциональный объект с перегруженным оператором ==, вот его адрес и передаётся в качестве предиката.

Спасибо, не знал... Собственно, я с бустом пока не работал... :7:
__________________
Хочешь быть счастливым - будь им! (с) Козьма Прутков.
Ностальгия — это попытка сравнить наихудшее из настоящего с наилучшим из прошлого. (c) ?
kvm вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сообщение об ошибке “UdiskV . Run-time error ‘75’: Path/File access error. OK stills Скорая помощь 3 10.01.2009 11:22
TeeChart for QuickReport 4 in BDS2006 KVA21 Компоненты 1 25.10.2008 21:09
Status Error: Data error Witaly Архив 2 26.02.2008 12:32
ищется Report builder + Pragnaan Export Devices для BDS2006 BenGun Компоненты 0 06.12.2007 10:29
Как собрать дистрибутив BDS2006 из 4х дисков в 1 DVD SCUTUM Программирование 5 16.11.2006 20:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:15. Часовой пояс GMT +3.


Copyright ©2004 - 2026 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.05486 секунды с 11 запросами