Ü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



  • @unskilled

    Das kompiliert weder unter gcc noch Visual Studio



  • Solle vermutlich auch

    f.template Do<int>()
    

    heissen.


  • Administrator

    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


Anmelden zum Antworten