Problem mit make_pair
-
Ich hoffe einfach mal, dass ich hier im richtigen Unterforum bin. Wenn nicht bitte ich schonmal um Verzeihung.

Ich arbeite mich, mit Hilfe von Heiko Kalistas "C++ für Spieleprogrammierer", gerade in C++ ein. Nun, alles ist sauber gelaufen und ich habe auch alles verstanden. Auch die Maps habe ich verstanden, aber der Compiler (Visual C++ 6.0) wohl nicht.
Ich poste einfach mal das Beispiel aus dem Buch und die Fehler die dann auftreten .
// C++ für Spieleprogrammierer // Listing 9.8 // Maps mit der STL // #pragma warning (disable:4786) #include <iostream> #include <map> #include <string> using namespace std; // Hauptprogramm // int main () { // Variablen // map<string, int> Punktetabelle; // Map map<string, int>::iterator i; // Iterator für die Map pair<string, int> Spieler; // Paar-Objekt für die Map // Anlegen von Spielerdaten (Map mit Daten füllen) // cout << "Spielerdaten werden angelegt\n\n"; // Paare mit der Funktion "make_pair" erzeugen // und in die Map schieben Spieler = make_pair ("Tobi", 2500); Punktetabelle.insert (Spieler); Spieler = make_pair ("Peter", 43800); Punktetabelle.insert (Spieler); Spieler = make_pair ("Maria", 26500); Punktetabelle.insert (Spieler); Spieler = make_pair ("Nina", 22350); Punktetabelle.insert (Spieler); Spieler = make_pair ("Andi", 21080); Punktetabelle.insert (Spieler); // Paar "manuell" erzeugen und in die Map schieben Spieler.first = "Marc"; Spieler.second = 18400; Punktetabelle.insert (Spieler); // Suche nach Spieler "Peter" cout << "Suche nach Spieler \"Peter\"\n\n"; i = Punktetabelle.find ("Peter"); // Prüfen, ob ein entsprechender Eintrag gefunden wurde if (i != Punktetabelle.end() ) { // Ja, dann Spielerdaten ausgeben cout << "Spieler \"Peter\" wurde gefunden." << endl; cout << "Er hat " << i->second << " Punkte erreicht"; cout << "\n\n"; } else { // Nein, dann Fehlermeldung ausgeben cout << "Spieler \"Peter\" wurde nicht gefunden"; cout << endl; } // Anzahl der eingetragenen Spieler ausgeben sowie // deren Namen und erreichte Punkte cout << "Auflistung aller Spieler in der Tabelle:\n"; cout << "(Insgesamt " << static_cast<int> (Punktetabelle.size () ); cout << " Eintraege)" << "\n\n"; for (i= Punktetabelle.begin(); i!= Punktetabelle.end(); ++i) { cout << "Spieler " << i->first << " hat "; cout << i->second << " Punkte erreicht"; cout << "\n\n"; } // Einen Eintrag direkt ansprechen, indem die Map wie ein // Array verwendet wird cout << "Eintrag direkt ausgeben: " << endl; cout << "Spieler \"Nina\" hat "; cout << Punktetabelle["Nina"]; cout << " Punkte erreicht" << endl; return 0; }Und der Fehler:
c:\programme\microsoft visual studio\vc98\include\utility(21) : error C2536: 'std::pair<char [5],int>::first' : Angabe einer expliziten Initialisierung fuer Felder nicht moeglich c:\programme\microsoft visual studio\vc98\include\utility(25) : Siehe Deklaration von 'first' c:\programme\microsoft visual studio\vc98\include\utility(21) : Bei der Kompilierung der Member-Funktion '__thiscall std::pair<char [5],int>::std::pair<char [5],int>(const char (&)[5],const int &)' der Klassenvorlage Fehler beim Ausführen von cl.exe. Listing 1_1.obj - 1 Fehler, 0 Warnung(en)Das "#pragma warning (disable:4786)" habe ich selber eingebaut, da das Ganze sonst deutlich länger wird.
Wo liegt jetzt das Problem? Ich hoffe ihr könnt mir helfen.
-
Tobias Xy schrieb:
Auch die Maps habe ich verstanden, aber der Compiler (Visual C++ 6.0) wohl nicht.
Nimm mal nen neueren Compiler
-
Naja, der Compiler war auf der CD die mit dem Buch mitgeliefert wurde. Von daher gehe ich aus, dass es nicht an der Compilerversion liegen sollte.
Zudem sind einige Erklärungen aus dem Buch explizit für diesen Compiler zugeschnitten, also wäre es wohl besser wenn ich diesen beibehalten könnte.
-
Visual Studio 2003 compiliert das ohne Probleme.
-
Tja, der gleiche Code meldet beim VS2005 keinen Fehler.
Und auch keine Warnings, wenn ich die #pragma direktive weglasse.
-
probier mal
make_pair( string( "Tobi" ), 2500 );Trotzdem ist Visual Studio 6 gnadenlos veraltet.
cheers, Swordfish
-
In welcher Zeile tritt den der Fehler auf?
Ich tippe auf die make_pair-Zuweisung(en).
Als Abhilfe könntest du jeweils die String-Literale als string dem pair übergeben:Spieler = make_pair (string("Tobi"), 2500);
-
Ok, das funktioniert. Wo kann ich mir denn einen neueren Compiler runterladen?
-