2013-04-24 5 views
0

Пример здесь: http://www.cplusplus.com/reference/algorithm/sort/Используя класс по станд: сортировки()

показывает, что

struct myclass { 
    bool operator() (int i,int j) { return (i<j);} 
} myobject; 

int main() { 
    int myints[] = {32,71,12,45,26,80,53,33}; 
    std::vector<int> myvector (myints, myints+8);    // 32 71 12 45 26 80 53 33 

    // using object as comp 
    std::sort (myvector.begin(), myvector.end(), myobject);  //(12 26 32 33 45 53 71 80) 
} 

Это прекрасно работает, но я пытаюсь использовать класс вместо структуры. Так что я делаю:

CardComparer класс:

bool CardComparer::operator() (Card* firstCard, Card* secondCard) { 
    this->firstCard = firstCard; 
    this->secondCard = secondCard; 
    if (firstCard->GetRank() == secondCard->GetRank()) { 
     return firstCard->GetSuit() > secondCard->GetSuit(); 
    } 
    else { 
     return firstCard->GetRank() > secondCard->GetRank(); 
    } 
} 

и это главное:

CardComparer* compare; 
compare = new CardComparer(); 
sort(cards.begin(), cards.end(), compare->operator()); 

Я получаю эту длинную ошибку:

hand.cpp: In member function 'void Hand::AddCard(Card*)': 
hand.cpp:60:54: error: no matching function for call to 'sort(std::vector<Card*>::iterator, std::vector<Card*>::iterator, <unresolved overloaded function type>)' 
hand.cpp:60:54: note: candidates are: 
In file included from /usr/include/c++/4.7/algorithm:63:0, 
       from hand.cpp:4: 
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter) 
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note: template argument deduction/substitution failed: 
hand.cpp:60:54: note: candidate expects 2 arguments, 3 provided 
In file included from /usr/include/c++/4.7/algorithm:63:0, 
       from hand.cpp:4: 
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<Card**, std::vector<Card*> >; _Compare = bool (CardComparer::*)(Card*, Card*)] 
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note: no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (CardComparer::*)(Card*, Card*)' 

Я не мог» t действительно найти решение, потому что, если я изменяю образец и сохраняю его как структуру, он отлично работает, но не работает, когда я его конвертирую i к классу.

+0

A структура * есть * a класс. Вы имеете в виду, что вы пытаетесь использовать указатель (а затем указатель-член-указатель), когда вам нужен объект. Вместо этого используйте объект класса/структуры, как демонстрирует пример. –

ответ

4

Третий аргумент называется функтором и является тем, что можно назвать. Либо указатель на функцию, либо C++ 11 лямбда, либо объект экземпляр (не указатель) с функцией-членом operator().

В вашем случае, не динамически выделять объект функтора в куче, этого достаточно, чтобы объявить его в качестве временного объекта в std::sort вызова:

std::sort(cards.begin(), cards.end(), CardComparer()); 

В приведенном выше std::sort вызова, используя CardComparer()создает объект в стеке, этот объект является временным и действителен только при запуске std::sort. Функция std::sort будет вызовет этот объект, который аналогичен вызову функции operator() на объект.

Поскольку функтор сравнения довольно прост, он не должен хранить любые данные:

struct CardComparer 
{ 
    bool operator() (const Card* firstCard, const Card* secondCard) const { ... } 
}; 

Так что нет необходимости в полях данных члена.

+0

Спасибо, но я только начал программировать на C++ и новый для классов. Итак, что может исправить эту ошибку? –

+0

Спасибо, что работает! –

+0

Я понял, что на самом деле это не оператор. Я намеренно положил cout << "test"; в операторе, и ничего не распечатывается. –