2016-07-07 6 views
0

Meine Aufgabe ist es, eine Kombination aus Std-Set, Map oder Multimap zu verwenden, um eine Sammlung von Kursen mit Voraussetzungen zu implementieren. Die Aufgabe war ein bisschen offen und ich habe Schwierigkeiten damit anzufangen. die folgendeKarte und Set einfügen Funktion wird nicht aufgelöst

//A collection of courses with no duplicates. 
typedef std::set<Course, less<Course> > CourseSet; 
//A map from a course to zero or more other courses. 
typedef std::multimap<Course, Course, less<Course>> CourseMap; 

In einem Konstruktor für CourseCatalog Ich erkläre die folgende

CourseSet coursesOffered; 
CourseMap enables; 

unter courseCollections.h Ich habe Ich versuche, eine Funktion zu implementieren Kurse zu dem Satz hinzuzufügen und Karte, aber ich erhalte Kompilierungsfehler, wenn ich versuche, enables.insert zu verwenden. Warum funktioniert das nicht so, wie ich es erwarten würde?

void addCourses (
     const Course& course1, 
     const Course& prereqOfCourse1) 
{ 
    enables.insert(course1, prereqOfCourse1); //error Method 'insert' could not be resolved 
} 

Antwort

2

Dies ist auf die Tatsache zurückzuführen, dass enables.insert() ein Argument des Typs nimmt CourseSet::value_type, die in diesem Fall std::pair<const Course, Course> ist. Sie geben es stattdessen zwei Argumente. Es gibt zwei normale Möglichkeiten, dieses Problem zu lösen:

enables.insert(std::make_pair(course1, prereqOfCourse)); 

Hier gibt du insert() die Art es will. Die zweite Lösung kann mehr, was Sie wollen, aber:

enables.emplace(course1, prereqOfCourse); 

enables.emplace nimmt als Argumente die Argumente an den Konstruktor CourseSet::value_type. Dies ist ein wenig weniger ausführlich und wahrscheinlich einfacher zu lesen und zu verstehen.

Hinweis: std::multimap<T>::emplace erfordert C++ 11-Unterstützung (mindestens).

+0

Danke. Es scheint, als gäbe es ein tiefer liegendes Problem, da der Compiler keine Freigaben auflösen kann. Ich arbeite mit ziemlich vagen Anweisungen darüber, was der Instruktor erwartet, also habe ich ihn direkt angesprochen, aber danke, dass du bestätigt hast, dass das, was ich erwartet habe, nicht weit weg war. – Addy

3

std::map::insert() nimmt einen Parameter, eine std::pair, und nicht zwei getrennte Parameter.

enables.insert(std::make_pair(course1, prereqOfCourse1));