LINUX.ORG.RU

проблема с std::find по std::map с унарным предикатом

 


0

2

Привет! Досталось тут перенести древний проект с bcppb6 под linux. Сначала решил его собрать, посмотреть что да как. Наткнулся на кучу неработающий кусков, с какими могу разбираюсь. Но в одном месте есть код, который не хочет компиляться и я не пойму что надо сделать с ним:

// h-file
    typedef std::pair<int, AnsiString> IntStringPair;
    typedef std::pair<int, IntStringPair> EdProgPair;
    typedef std::map<int, IntStringPair> EdProgramMap;

    EdProgramMap edprogrammap_;

// cpp-file
        EdProgramMap::const_iterator citer

        class UnaryPredicate {
        public:
            UnaryPredicate(const EditAchievementRow& ear)
                : ear_(ear) {}
            bool operator()(const EdProgPair& epp)
            {
                return epp.second.first == ear_.id_edform_;
            }
        private:
            EditAchievementRow ear_;
        };

        citer = std::find(
                    edprogrammap_.begin(),
                    edprogrammap_.end(),
                    UnaryPredicate(ear_)
                );

        if (citer != edprogrammap_.end())
            cmbEdProgram->ItemIndex = (*citer).first;
    }

Тут вроде должен происходить поиск по map'е, я думаю из-за того, что у контейнера аргумент типов это

std::pair<int, std::pair<int, AnsiString> >
, то он не может нормально вывести тип итераторов. Вот выхлоп на строку с find: E2285 Could not find a match for '_STL::find<_InputIter,_Tp>(_STL::_Rb_tree_iterator<_STL::pair<const int, _STL::pair<int,AnsiString> >,_STL::_Nonconst_traits<_STL::pair<const int,_STL::pair<int,AnsiString> > > >,_STL::_Rb_tree_iterator<_STL::pair<const int, _STL::pair<int,AnsiString> >,_STL::_Nonconst_traits<_STL::pair<const int,_STL::pair<int,AnsiString> > > > ,UnaryPredicate)'

Подскажите что где подписать?



Последнее исправление: justice_for_all (всего исправлений: 1)

Функция find использует при работе оператор «==». Попробуй переопределить этот опрератор.

anonymous
()
Ответ на: комментарий от anonymous

Так на то он и унарный предикат, что его оператор operator()() вызывался с одним аргументов, а если точнее, то с разыменованным итератором *iter. А внутри перегруженного оператора вызова функции должно происходить сравнение и возврат [bool].

justice_for_all
() автор топика

Сделайте operator() предиката константным.

slovazap ★★★★★
()

1. Нужен find_if вместо find.

2. А если оператор будет определен так:

bool operator()(const EdProgramMap::value_type & epp)
?

eao197 ★★★★★
()
Ответ на: комментарий от Uter

Я так понимаю, что он пытается собрать код каким-то Borland-овским компилятором, а там у STL-я могут быть свои причуды.

eao197 ★★★★★
()
Ответ на: комментарий от Uter

Вы правы, не договариваю тот факт, что класс UnaryPredicate является вложенным для метода внутри которого используется find.

Если вынести его определение за область видимости метода в объявление класса этого метода, все чудесно работает. Надо покурить стандарт.

justice_for_all
() автор топика
Ответ на: комментарий от eao197

Именно так, там используется древний STLPort, но проблема оказалась, как всегда, на поверхности.

justice_for_all
() автор топика

Решено. Всем спасибо за ценные советы!

justice_for_all
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.