2013-05-03 25 views
7

Mam wektor wskaźników klasy std::vector<Square*> listSquares. Chcę posortować go za pomocą jednego z atrybutów klasy jako klucza. To, co robięstd :: sort() na wektorze klasy wskaźników

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

ale kompilator mówi: błąd: nie pasującej funkcji dla wywołania do „sort (std :: vector :: iterator, std :: vector :: iterator, < nierozwiązany przeciążony funkcja typu >) "

co ja tu robię źle?

+6

Jeśli można użyć C++ 11, należy zrobić to lambda: 'std :: sort (listSquares.begin(), listSquares.end() [] (Plac * a, Plac * b) {return a-> getId() < b-> getId;}) '. – leftaroundabout

+2

Upewnij się, że rzeczywiście chcesz wskaźników, a nie tylko obiektów. – chris

+0

Nie mogę używać C++ 11. @chris Jestem pewien, że chcę używać wskaźników. – qutab

Odpowiedz

12

Aby użyć compById jako parametru do std::sort, nie powinno to być funkcją członka. To jest złe

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

Jest lepiej,

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

Dziękuję bardzo. To był problem. Ale dlaczego nie możemy ogłosić go jako funkcję członka? Właściwie używam go w innej klasie niż sam kwadrat. – qutab

+2

Bo jak std :: sort wiedzieć, który obiekt użyć, gdy wywołuje funkcję członka? Funkcje członkowskie mogą być wywoływane tylko na obiektach, ale std :: sort nie ma kontekstu określającego, który obiekt powinien być. Prawdopodobnie wywołujesz std :: sort z wnętrza jakiegoś obiektu, ale nie przekazujesz tego obiektu do std :: sort. std :: sort nie wie nic o tym, skąd jest wywoływany, tylko że zna trzy parametry, które mu przekazujesz. – john

+3

+1 za umiejętność telepatii – Basilevs

3

Najważniejszą brakującą częścią jest to, że argumenty funkcji porównywania to const. Innym jest typ zwrotu. Jeśli pominiesz typ zwracany podczas deklarowania funkcji, kompilator przyjmie, że zwróci ona int, co nie jest poprawne w tym przypadku.

Oczywiście funkcja porównania musi być w zasięgu podczas wywoływania funkcji std::sort.

+0

Nawet jeśli używam const, pojawia się ten sam błąd. W tym przypadku dostaję również, gameplay.cpp: 911: error: przekazanie 'const Square' jako 'ten' argument 'int Square :: getId()' kwalifikatory odrzuceń [-fpermissive] – qutab

+1

@qutab, musisz zrobić getId() również funkcję członka składowego. – richselian

1

Można użyć funkcji składowej. Ale musisz zdefiniować go jako statyczną funkcję członkowską i wywołać ją z klasy, a nie z instancji klasy.

Zawiadomienie static przed deklaracją funkcji i Square:: przed sortowaniem nazwy funkcji.

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
} 
Powiązane problemy