2013-03-06 2 views
-1

Я использовал find_if раньше со списками и векторами на C++, и он отлично работал. Но теперь, когда я пытаюсь использовать его с комплектами я получаю следующее сообщение об ошибке:find_if in set in C++: нерешенный перегруженный тип функции

error: no matching function for call to ‘find_if(std::set<A, Acmp>::iterator, 
std::set<A, Acmp>::iterator, <unresolved overloaded function type>)’| 

Мой класс выглядит следующим образом:

bool searchForA(A i) { 
    return (i.getVal() > 0); 
} 


void B::findA() 
{ 
    set<A, Acmp> cont; 
    set<A, Acmp>::iterator it; 
    A *a1 = new A(5); 
    A *a2 = new A(7); 
    cont.insert(*a1); 
    cont.insert(*a2); 

    it = find_if (cont.begin(), cont.end(), search) 
} 

Может кто-нибудь помочь мне понять, где проблема?

+0

Нет. Я не включил это внутри класса A для набора. ЕСЛИ я могу спросить, зачем перегружать <влиять на find_if? – FranXh

+0

Как насчет объявления 'search (A const & i)' –

+0

Это прекрасный способ утечки памяти. Указатели совершенно не нужны. Кстати, [это] (http://liveworkspace.org/code/3v0m5c%247) близок и работает. – chris

ответ

1

В STL уже есть функция, называемая search. Вероятно, поэтому компилятор не может решить правильное имя без лучшего намека. Вы можете переименовать свою функцию поиска. Или, если вы этого не хотите, попробуйте передать ::search вместо find_if.

+0

Это то, что я изначально думал. Я попытался изменить имя функции. По-прежнему такая же ошибка. – FranXh

+0

Нет, изменение имени функции устраняет эту ошибку. Вы получаете еще одну большую ошибку, потому что А нужен оператор сравнения, как говорят другие люди. –

+0

Да, меняя имя, исправлена ​​проблема. – FranXh

1

Существует более одной функции с именем search - имя перегружено. Чтобы передать указатель на search в find_if, вам нужно указать, какой из них. Самый простой способ - указать static_cast< bool (*)(A) >(cont).