2016-10-05 3 views
-3
#include <set> 
#include <string> 
using namespace std; 
struct StudInfo{     //declaration of structure 
    string name; 
    int id; 
}; 
int compareID(StudInfo a , StudInfo b){   //Compare function as a parameter 
    if(a.id == b.id) return 0;     //that is being passed to the set s 
    if(a.id < b.id) return -1; 
    else return 1; 
} 
int main(){ 
    set<StudInfo> s(CompareID); 
    return 0; 

} 

Innerhalb des main() Umfangs erhalte ich diesen Fehler (Fehler C2065: ‚CompareID‘: nicht deklarierter Bezeichner) Obwohl dieser derselbe Code erfolgreich in der im Video Vortrag zusammengestellt wurde dieser Code war geschrieben Bitte helfen.Fehler in Satz Erklärung C++

+2

Groß- und Kleinschreibung. Überprüfen Sie die Rechtschreibung und das Gehäuse erneut. –

+1

Ihre Funktion beginnt mit einem Kleinbuchstaben 'c', aber Sie geben' CompareID', die mit Großbuchstaben 'C' beginnt? – piwi

+2

Schauen Sie sich auch die Voraussetzungen für den Vergleich in 'std :: set' an. Dein trifft sie nicht. Es muss einen weniger als einen Vergleichstyp modellieren. – juanchopanza

Antwort

1

Goldene Regel der Programmierung: 99,9% der Compilerfehler sind wegen Ihnen, nicht der Compiler.

zwar derselbe Code erfolgreich in dem Video-Vortrag zusammengestellt wurde in dem dieser Code

Nein es nicht geschrieben wurde!

Woher weiß ich das? Nun, es ist ziemlich einfach. Zuallererst rate ich jede Möglichkeit, dass der Compiler schuld ist. Das erlaubt mir, mich auf den Quellcode und des Compiler-Ausgangs zu konzentrieren. Die Lösung ist einfach: Ersetzen Sie set<StudInfo> s(CompareID); durch set<StudInfo> s(compareID);. Notieren Sie den Fall sorgfältig.

Kompilierungsjob erledigt.

Dann können wir zu Ihrem Laufzeitverhalten weitergehen. Ihre Komparatorfunktion ist nicht korrekt angegeben. Sie müssen die Funktion mit

bool compareID(const StudInfo& a, const StudInfo& b){ 
    return a.id < b.id; 
} 

Der Komparator false ersetzen für alle Fälle zurückkehren müssen, wo a.idnicht weniger als b.id ist. Hinweis: Ich übergebe die Parameter durch const Referenz, um unnötige Zeichenketten zu vermeiden.

+0

Fertig, bis sich das Komparator-Problem zur Laufzeit manifestiert. – juanchopanza

+0

Benötigt der Konstruktor nicht einen Funktor anstelle einer Funktion? Wie in http://stackoverflow.com/questions/2620862/using-custom-stdset-comparator? – Philipp

+0

Sie können einen Funktor verwenden, wenn Sie * State * benötigen, wenn Sie nicht dann eine reguläre Funktion ausreichen. Die coolen Katzen benutzen heutzutage Lambdas. – Bathsheba