2015-02-27 16 views
7

Appena trascorso circa un'ora cercando di capire perché ottengo 20 messaggi di errore del tipo "Semantic issue - no matching function for call to 'swap'" quando provo a creare la classe seguente (in XCode).sort() - Nessuna funzione di corrispondenza per la chiamata a "scambio"

test.h

#include <iostream> 
#include <string> 
#include <vector> 


class Test{ 
    std::vector<std::string> list; 

    void run() const; 
    static bool algo(const std::string &str1, const std::string &str2); 
}; 

test.cpp

#include "test.h" 


void Test::run() const { 
    std::sort(list.begin(), list.end(), algo); 
} 


bool Test::algo(const std::string &str1, const std::string &str2){ 
    // Compare and return bool 
} 

La maggior parte delle persone con lo stesso problema sembrano aver fatto il loro algoritmo di un membro della classe, invece di un membro statico , ma questo non è chiaramente il problema qui.

+3

Spero che l'implementazione di "algo" sia solo un segnaposto. L'ordinamento non funzionerà (correttamente) con un comparatore che permetta di 'a1 anderas

+1

Sì. Ho modificato il codice in modo che le persone non si blocchino su dettagli irrilevanti ... – BadCash

risposta

13

Si scopre che è un problema molto semplice, ma non molto evidente per individuare (e il messaggio di errore non fa un ottimo lavoro per aiutare, in alternativa):

Rimuovere la dichiarazione const su run() - voilá .

+1

Il messaggio di errore dovrebbe almeno puntare nella giusta direzione, ma è necessario controllare il testo completo dell'errore non solo quello che XCode mostra in linea. – Ionut

4

Il compilatore fa riferimento a swap perché utilizza lo scambio di funzioni internamente con std::sort. Tuttavia, come funzione membro run viene dichiarata come funzione costante

void run() const; 

quindi l'oggetto della classe stessa è considerata come un oggetto costante e quindi elenco componente di dati è anche un oggetto costante

std::vector<std::string> list; 

Così il compilatore prova a chiamare swap con parametri che sono riferimenti costanti o addirittura non sono riferimenti e non riescono a trovare tale funzione.

Problemi correlati