2012-04-03 2 views
-1

ich einen String Karte in es mit zwei Einträgen haben: "Chicago"--> ChicagoObj und "NewYork"-->NewYorkObj, wo ChicagoObj und NewYorkObj Zeiger auf Objekte von MyClass sind.std :: map funktioniert unter Windows 32-Bit aber stürzt auf 64-Bit-

Der folgende Code kompiliert und läuft gut in 32-Bit, kompiliert es in 64-Bit, aber stürzt immer in 64-Bit nach dem Ausdruck Chicago Eintrag ab. Jede Hilfe wird geschätzt!

typedef std::map<std::string, MyClass*> MyStringMap; 
MyStringMap my_map; 

std::string key1="Chicago"; 
MyClass *ChicagoObj = new MyClass; 
my_map[key1] = ChicagoObj; 

std::string key2="NewYork"; 
MyClass *NewYorkObj = new MyClass; 
my_map[key2] = NewYorkObj ; 

MyStringMap::iterator iObjMap = my_map.begin(); 

while (iObjMap != my_map.end()) 
{ 
    std::string key = iObjMap->first; 

    std::cout<<"name of the key in the map: " << key <<std::endl; 
    iObjMap++; 
} 
+1

Ich sehe gemischte Verwendung von "string" und "std :: string", ich nehme einen Tippfehler an, sonst ist es möglich, dass "string" möglicherweise gar kein "std :: string" ist. – SirDarius

+3

Sie sollten keine 'C'-artigen Umwandlungen mit Objekttypen wie' std :: string' verwenden, auch wenn es in diesem Fall harmlos aussieht. – Chad

+0

Kompiliert dieser Code tatsächlich? Es scheint ein paar Dinge zu fehlen, zum Beispiel, was ist "my_map"? – josephthomas

Antwort

0

Sind Sie sicher, dass Sie den neuesten Code kompiliert haben und kein Programm mit einem früheren Fehler ausführen? Ich habe Ihren Code in Visual Studio 2010 unter Windows 7 64 kompiliert und es gibt keine Probleme.

Es gibt einen Kompilierungsfehler in Ihrem Code, std::out sollte std::cout sein. Abgesehen davon gibt es nicht einmal eine Warnung von/Wall.

+0

"Es gibt nicht einmal eine Warnung von/Wall." Das kann nicht wahr sein.Die Header der Standard Library (wie '') werden nicht sauber mit/Wall kompiliert. Meinst du/W4? –

+0

Ich meine/Wand von seinem Code, nicht von anderen umfasst. – josephthomas

0

Da Sie offenbar keine vollständige, übersetzbar Stück Code schreiben, das Problem zu demonstrieren, hier ist eine kurze Demonstration, wie es funktionieren kann:

#include <map> 
#include <iostream> 
#include <string> 
#include <iterator> 

class City { 
    unsigned int population; 
    // probably more stuff here, but this should be enough for now. 
public: 
    City(int pop=0) : population(pop) {} 

    friend std::ostream &operator<<(std::ostream &os, City const &c) { 
     return os << c.population; 
    } 

}; 


std::ostream &operator<<(std::ostream &os, 
         std::pair<std::string, City> const &d) 
{ 
    return os << d.first << ": " << d.second; 
} 

int main() { 
    std::map<std::string, City> cities; 
    typedef std::pair<std::string, City> ct; 

    cities["Chicago"] = City(3456789); 
    cities["New York"] = City(8765432); 

    std::copy(cities.begin(), cities.end(), 
     std::ostream_iterator<ct>(std::cout, "\n")); 

    return 0; 
} 

ich zusammengestellt habe und getestet diese auf 64- bit Windows, und es scheint gut zu funktionieren. Es scheint (zumindest für mich), dass map auf 64-Bit-Windows ohne Probleme funktioniert. Genau das, was Sie getan haben, ist es schwer zu erraten, aber es kann einfacher sein, Arbeitscode zu erweitern, um das zu tun, was Sie wollen, als herauszufinden, was in Code, der nicht funktioniert, gebrochen ist.

Verwandte Themen