Template Spezialisierung => HILFE!



  • Hallo Forum,

    ich kämpfe gerade mit Templates und habe per Google und Co nicht wirklich verständliche Hilfe finden können.
    Mal ganz einfach gefragt: wie müsste folgender Code geändert werden, dass er kompiliert (Compiler=MSVC2005) ?

    template<class T> class X
    {
    public:
    	X(){;};
    	void Test( T & i ) // soll für double, int... immer gleich sein
    	{
    		cout << i << endl;
    	};
    	void doOUT( T & i ); // soll für double, int... unterschiedlich implementiert werden
    };
    
    template <typename T> void X<int>::doOUT( T & i )
    {
    	cout << 2*i << endl;
    };
    
    template <typename T> void X<double>::doOUT( T & i )
    {
    	cout << 3.0*i << endl;
    };
    

    grübel,grübel...



  • Hi!

    Ich denke es müsste so gehen:

    template <> void X<int>::doOUT( int & i )
    {
        cout << 2*i << endl;
    }
    
    template <> void X<double>::doOUT( double & i )
    {
        cout << 3.0*i << endl;
    }
    

    KaPtainCugel



  • Z.B: so:

    template <typename T> class X
    {
    public:
    	X () {}
    	void Test (T& i)
    	{
    		cout << i << endl;
    	}
    	void doOUT (T& i);
    };
    
    template <> void X <int>::doOUT (int& i)
    {
    	cout << 2 * i << endl;
    }
    
    template <> void X <double>::doOUT (double& i)
    {
    	cout << 3.0 * i << endl;
    }
    

    Aach, schon wieder zu spät 🙄



  • danke!!!! 🙂

    die Funktion doOUT funktioniert jetzt, aber: jetzt noch ein Level schwieriger, vgl. Funktion doOUT2.

    template<class T> class X
    {
    public:
    	X(){;};
    	void Test( T & i ) // soll für double, int... immer gleich sein
    	{
    		cout << i << endl;
    	};
    	void doOUT( T & i ); // soll für double, int... unterschiedlich implementiert werden
    
    	template< class Y > void doOUT2( Y & r, T & i ); // soll für double, int... unterschiedlich implementiert werden
    };
    
    template <> void X<int>::doOUT( int & i )
    {
        cout << 2*i << endl;
    }
    
    template <> void X<double>::doOUT( double & i )
    {
        cout << 3.0*i << endl;
    }
    
    template <class Y> void X<int>::doOUT2( Y&r, int & i )
    {
        cout << 2*i << endl;
    }
    
    template <class Y> void X<double>::doOUT2( Y&r, double & i )
    {
        cout << 3.0*i << endl;
    }
    

    Der Compiler bricht jetzt mit der Fehlermeldung

    error C2244: 'X<T>::doOUT2': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden

    ab.

    Kann man mit Templates so weit gehen? 😕

    Danke nochmals... 🙂



  • Sollte so gehen (zumindest kompiliert es der BCB):

    template <> template <typename Y> void X <int>::doOUT2 <Y> (Y& r, int& i)
    {
    	cout << 2 * i << endl;
    }
    
    template <> template <typename Y> void X <double>::doOUT2 <Y> (Y& r, double& i)
    {
    	cout << 3.0 * i << endl;
    }
    


  • Supi, vielen Dank.

    Der MSVC2005 akzeptiert scheinbar nur eine leicht geänderte Syntax:

    template <> template <typename Y> void X <int>::doOUT2 (Y& r, int& i)
    {
        cout ...
    }
    
    template <> template <typename Y> void X <double>::doOUT2 (Y& r, double& i)
    {
        cout ...
    }
    

    d.h. das

    <Y>

    mag MSVC2005 nicht ...

    Also nochmals vielen Dank, jetzt habe ich keine Fragen mehr! 🙂 🙂



  • atlastraeger schrieb:

    d.h. das

    <Y>

    mag MSVC2005 nicht ...

    Das gehört dort auch nicht hin. Scheinbar ein Fehler beim BCB.


Anmelden zum Antworten