2013-05-03 15 views
7

Possiedo un vettore di puntatori di classe std::vector<Square*> listSquares. Voglio ordinarlo con uno degli attributi della classe come chiave. Questo è quello che sto facendostd :: sort() su un vettore di puntatori di classe

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

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

ma il compilatore dice: errore: nessuna funzione di corrispondenza per la chiamata all 'ordinamento (std :: vector :: iterator, std :: vector :: iterator, < irrisolto sovraccarico tipo di funzione >) '

cosa sto facendo di sbagliato qui?

+6

Se è possibile utilizzare C++ 11, si dovrebbe fare di questo un lambda: 'std :: sort (listSquares.begin(), listSquares.end(), [] (Piazza * a, * b Piazza) {return a-> getId() < b-> getId;}) '. – leftaroundabout

+2

Assicurati di volere effettivamente dei puntatori e non solo degli oggetti. – chris

+0

Non riesco a usare C++ 11. @chris Sono sicuro di voler usare i puntatori. – qutab

risposta

12

Per utilizzare compById come parametro su std::sort, non deve essere una funzione membro. Questo è sbagliato

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

Questo è meglio,

class Square 
{ 
    ... 
}; 

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

Grazie mille. Questo era il problema Ma perché non possiamo dichiararlo come una funzione membro? In realtà lo sto usando in una classe diversa dalla stessa piazza. – qutab

+2

Perché in che modo std :: sort sa quale oggetto utilizzare quando chiama la funzione membro? Le funzioni membro possono essere richiamate solo sugli oggetti, ma std :: sort non ha contesto per determinare quale oggetto deve essere. Presumibilmente stai chiamando std :: sort dall'interno di qualche oggetto, ma non stai passando quell'oggetto a std :: sort. std :: sort non sa da dove viene chiamato, tutto ciò che conosce sono i tre parametri che gli vengono assegnati. – john

+3

+1 per abilità telepatia – Basilevs

3

La parte più importante che ti manca è che gli argomenti della funzione di confronto sono const. Un altro è il tipo di ritorno. Se si omette il tipo restituito quando si dichiara una funzione, il compilatore supporrà che restituisca int che non è corretto in questo caso.

E naturalmente la funzione di confronto deve essere compresa nella portata quando si chiama la funzione std::sort.

+0

Anche se uso const, ottengo lo stesso errore. In questo caso ottengo anche, gameplay.cpp: 911: errore: passando 'const square' come 'this' argomento di 'int Square :: getId()' scarta qualificatori [-fpermissive] – qutab

+1

@qutab, devi fare getId() anche una funzione membro const. – richselian

1

è possibile utilizzare una funzione membro. Ma devi definirlo come una funzione membro statica e chiamarla dalla classe, non da un'istanza della classe.

Avviso static prima della dichiarazione di funzione e Square:: prima del nome della funzione in ordine.

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); 
} 
Problemi correlati