Übersetzungproblem: Visual Studio vs. gcc
-
Warum lässt sich folgender Code unter Visual Studio, aber nicht gcc 4.3.3 kompilieren?
class Foo { public: template<typename T> long Do() { return 0; } }; template<typename T> class Dispatch { public: template<typename T> static long Dispatch(T f, long n) { switch (n) { case 0: return f.Do<int>(); case 1: return f.Do<float>(); default: return -1; } } };Problem sollte klar sein. Ich möchte in Abhängigkeit von einem long-Wert auf eine bestimmte template Funktion in Foo dispatchen. Leider meckert hier der gcc die switch-Anweisung an.
Vielleicht hat einen Lösungsvorschlag?
-
Vielleicht sollte ich noch nachtragen:
// main Foo f; Dispatcher::Dispatch(f, 0); Dispatcher::Dispatch(f, 0);Eigentlich soll die Klasse auch Dispatcher heißen
-
Leider meckert hier der gcc die switch-Anweisung an.
Post den exakten Fehler.
Simon
-
Okay, Du hast recht. Hier noch mal alles zusammen:
class Foo { public: template<typename T> long Do() { return 0; } }; class Dispatcher { public: template<typename T> static long Dispatch(T f, long n); }; template<typename T> long Dispatcher::Dispatch(T f, long n) { switch (n) { case 0: return f.Do<int>(); case 1: return f.Do<float>(); break; default: return -1; } return 0; } int main(int argc, char* argv[]) { Foo f; Dispatcher::Dispatch(f, 0); Dispatcher::Dispatch(f, 1); return 0; }Und die Fehlermeldung:
../main.cpp: In static member function »static long int Dispatcher::Dispatch(T, long int)«: ../main.cpp:22: Fehler: expected primary-expression before »int« ../main.cpp:22: Fehler: expected »;« before »int« ../main.cpp:22: Fehler: expected unqualified-id before »>« token ../main.cpp:24: Fehler: expected primary-expression before »float« ../main.cpp:24: Fehler: expected »;« before »float« ../main.cpp:24: Fehler: expected unqualified-id before »>« token
-
return template f.Do<int>();bb
-
Das kompiliert weder unter gcc noch Visual Studio
-
Solle vermutlich auch
f.template Do<int>()heissen.
-
Unskilled ist unskilled, dass sollte wohl eher so heissen:
return f.template Do<int>(); // bzw. return f.template Do<float>();Grüssli

-
Fein, damit klappt es.

-
tz : <
war gerad erst aufgestanden und habs (deshalb wohl) iwie verplant -.-
bb