2009-06-02 3 views
1

Ich versuche, ein C++ - Projekt mit Microsoft VisualStudio 2008 zu kompilieren. Dieses spezielle Projekt kompiliert, wenn Sie Win32 als Zielplattform verwenden. Wenn ich versuche, das gleiche Projekt für die x64-Plattform zu kompilieren bekomme ich einen C2593 'operator identifier' is ambiguous Fehler in dieser Zeile:c2593 Fehler (Operator-ID ist mehrdeutig) beim Kompilieren für X64-Plattform

case 't': os_ << (size_t)path->rnode->char_type;  break; 

Wer hat eine Ahnung, warum die gleiche Linie für 32-Bit fein kompiliert aber nicht für 64-Bit mit einer solchen ein hoher Fehler?

Antwort

2

Ok, hab es. Das Problem ist der Datentyp size_t, der verschiedene Größen für die zwei verschiedenen Plattformen hat. Der Betreiber < < wird für eine verschiedene Liste der Datentypen definiert:

StringBuffer& operator<<(unsigned short int n) { _UITOA(n); } 
StringBuffer& operator<<(unsigned int n)  { _UITOA(n); } 

Auf einer 32-Bit-Plattform „unsigned int“ ist eine perfekte Ergänzung für size_t. Auf 64-Bit-Plattformen ist size_t 64 Bit und stimmt bei keiner Operatordeklaration genau überein.

Die Lösung ist, die genaue Operator unter Verwendung des richtigen Datentyp zu wählen:

case 't': os_ << (unsigned int)path->rnode->char_type;  break; 

oder der Betreiber mit size_t Überlastung:

StringBuffer& operator<<(size_t)  { _UITOA(n); } 
+0

oder unsigned long statt size_t –

+1

oder eine Template-Methode (da sie alle in String zu konvertieren scheinen. (PS Sie könnten boost :: lexical_cast <>() verwenden –