String nach Zahl klappt nicht
-
Hallo,
ich habe mir eine Funktion geschrieben um einen String zu einem Typ zu konvertieren:
template <typename T> T fromString(const std::string& str) { T value; std::istringstream stream(str); stream >> value; return value; }Leider gibt das diese Fehlermeldung:
error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istringstream' (or there is no acceptable conversion)
Wieso? Was ist denn da falsch?

-
Ich habe gerade rausgefunden, dass es offenbar mit dem Typ zusammenhängt:
fromString<int>(str); // Das hier kompiliert fromString<EXT_ST>(str); // Das hier nicht. EXT_ST ist ein enumWieso geht das bei einem enum nicht?
-
Habs mit gcc probiert.
Es klappt.#include <iostream> #include <sstream> template <typename T> T fromString(const std::string& str) { T value; std::istringstream stream(str); stream >> value; return value; } int main(){ std::string str="4711"; int i=fromString<int>(str); std::cout<<i<<'\n'; }
-
Der Operator >> muss für den Typen implementiert sein, damit das klappt.
-
Häßlich, langsam und grausam, aber tut's erstmal erklären, wo der Hase im Pfeffer liegt.
#include <iostream> #include <sstream> enum Farbe{ rot=1, tot=rot, blau=2, }; std::istream &operator>>(std::istream& in,Farbe& f){ std::string name; in>>name; if(name=="rot") f=Farbe::rot; else if(name=="tot") f=Farbe::tot; else if(name=="blau") f=Farbe::blau; else ;//?? return in; } std::ostream& operator<<(std::ostream& out,Farbe f){ if(f==Farbe::rot) out<<"rot"; //else... return out; } template <typename T> T fromString(const std::string& str) { T value; std::istringstream stream(str); stream >> value; return value; } int main(){ std::string str="rot"; Farbe i=fromString<Farbe>(str); std::cout<<i<<'\n'; }
-
Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!?

-
stringer2 schrieb:
Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!?

Eine Neuerung von C++0x?
Ja. http://www2.research.att.com/~bs/C++0xFAQ.html#enum
-
volkard schrieb:
stringer2 schrieb:
Ich seh gerade, du schreibst Farbe::rot. Ich schreibe in meinem Code immer nur rot. Ich wusste garnicht, dass das mit EnumTyp::Value geht?!?

Eine Neuerung von C++0x?
Ja. http://www2.research.att.com/~bs/C++0xFAQ.html#enumKlappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(
-
stringer2 schrieb:
Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(
Mach die doch einfach aus mit
#pragma warning(disable,4482)Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.
-
MSVC 2010 beherrscht strongly-typed enums (soweit ich weiß) nur in C++/CLI.
-
volkard schrieb:
stringer2 schrieb:
Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(
Mach die doch einfach aus mit
#pragma warning(disable,4482)Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.
Ne, das is mieser Stil.
@seldon: Ja, habs auch gerade gelesen. Naja, nicht so tragisch, benutz eh kein C++0x (bietet eh nix wirklich weltbewegendes^^)
-
volkard schrieb:
stringer2 schrieb:
Klappt bei mir (VS2010) nicht. enum class Color gibt einen Compiler error und enum Color { ... } Color c = Color::red gibt ein Warning:(
Mach die doch einfach aus mit
#pragma warning(disable,4482)Ich würde aber nochmal eine zweite Meinung einholen, ob das wirklich mit c++0x erlaubt ist.
-
stringer2 schrieb:
Ne, das is mieser Stil.
Den Compiler zu reparieren ist oberguter Stil!
Nur dadurch kann man auf maximaler Warstufe fahren und wird nicht verrückt dabei.
http://alfps.wordpress.com/2010/05/07/cppx-w4-no-warnings-disabling-msvc-sillywarnings/
Wobei ich nicht alle davon ausmachen würde, aber die meisten schon.Wenn Color::red erlaubt ist für nicht strong typed enums, dann wird in der nächsten Compilerversion die Warnung auch weg sein. Keine Gefahr, sich die Zukunft zu verbauen.
-
Ich liebe auch, wenn ich STL-Container nutze und in meiner DLL exportiere und dann ständig eine Warnung kommt, dass der verwendende Code dann auch die Header nutzt und daher die LIBs braucht und blub... -.- Aber die Warnung ist ja berechtigt, wayned mich halt eben nur an.