Template Spezialisierung für Konvertierungsoperator



  • Hallo,

    Ich habe eine Klasse mit einer Templatefunktion für den Konvertierungsoperator. Das funktioniert einwandfrei. Jetzt möchte ich eine Spezialisierung des Konvertierungsoperators für std::string. Leider gibt mein Compiler dazu immer einen Fehler aus. Kann mir jemand die korrekte Syntax für diese Spezialisierung sagen oder ist das gar nicht möglich?

    class DeviceSignal{
    	public:
    		// .. noch einiges mehr ..
    		template<class T> operator T()const{
    			return m_msg.getSignalValue(m_name);
    		};
    
    		// Die folgende Zeile führt zu: illegal explizit template specialisation
    		template<> operator std::string<std::string>() const{};	
    	private:
    		DeviceMessage& m_msg;
    		std::string m_name;
    
    	};
    	// Die folgende Zeile führt zu: declaration syntax error 
    	template<> DeviceSignal::operator std::string<std::string>() const;
    

    DJohn

    //EDIT die Rechtschreibung



  • schonmal versucht, die templateparameter direkt hinter das operator zu schreiben?:

    template<> operator<std::string> std::string() const {};
    

    weiß nicht genau wo man die template-parameter bei diesem operator hinschreibt, könnte mir aber vorstellen, dass es an dieser stelle ist.
    Denn: wenn man die spezialisierung statt mit std::string mit einer template-klasse A<B> machte, käme mit deiner schreibweise in etwa folgendes:

    template<> operator A<B><A<B> >() const
    

    , was doch etwas arg seltsam aussieht.
    Von daher vermutew ich, dass das die illegal explicit template specialization daher kommt, dass er das std::stringstd::string als template-spezialisierung von std::string auffasst, was aber garkein template ist...



  • Hallo pumuckl,

    Auch mit Deiner Variante kommen genau die gleichen Fehler. Innerhalb der Klasse tritt der Fehler

    illegal explizit template specialisation
    

    schon bei

    template<>
    

    auf und wenn ich es außerhalb der Klasse versuche, gibt es wieder

    declaration syntax error
    

    Ist sowas überhaupt erlaubt?

    DJohn



  • DJohn schrieb:

    Auch mit Deiner Variante kommen genau die gleichen Fehler. Innerhalb der Klasse tritt der Fehler

    illegal explizit template specialisation
    

    schon bei

    template<>
    

    auf

    Was daran liegt, dass Spezialisierung nur im Namespace-Scope nicht aber im Scope einer Klasse erfolgen dürfen.

    DJohn schrieb:

    und wenn ich es außerhalb der Klasse versuche, gibt es wieder

    declaration syntax error
    

    Ist sowas überhaupt erlaubt?

    Ja. Die korrekte Syntax lautet:

    template <>
    DeviceSignal::operator std::string() const;
    

    Ich würde hier allerdings Überladung statt Spezialisierung verwenden.



  • Danke HumeSikkins,

    so funktioniert es. Allerdings muss ich diese Spezialiserung immer noch in der Header-Datei implementieren. Warum reicht hier nicht der Prototyp in der Header-Datei und die Implementierung in der CPP-Datei? Durch die Spezialisierung sind doch alle Typen bekannt.

    Die Operator-Überladung funktioniert leider nicht, da durch das Template dann einfach 2 Konvertierungsoperatoren für std::string bereitstehen und der Compiler sich dann nicht mehr entscheiden kann, welchen er nehmen soll. Und um das Template ganz zu ersetzen, bin ich einfach zu faul.

    DJohn



  • Eigentlich sollte überladung reichen, oder?



  • DJohn schrieb:

    Die Operator-Überladung funktioniert leider nicht, da durch das Template dann einfach 2 Konvertierungsoperatoren für std::string bereitstehen und der Compiler sich dann nicht mehr entscheiden kann, welchen er nehmen soll.

    Dann ist dein Compiler in diesem Punkt aber nicht standardkonform. Bei der Auflösung von Überladungen werden non-templates bevorzugt.

    Allerdings muss ich diese Spezialiserung immer noch in der Header-Datei implementieren. Warum reicht hier nicht der Prototyp in der Header-Datei und die Implementierung in der CPP-Datei?

    Genau das sollte eigentlich reichen. Eine explizite Spezialisierung ist in dieser Hinsicht kein Template mehr. Definierst du eine solche Spezialisierung in einem Header und ist diese Definition nicht als inline deklariert, so solltest du eigentlich "multiple definition"-Fehler erhalten, sobald du die Spezialisierung in mehr als einer cpp-Datei verwendest.



  • Nochmal Danke,

    Meine Probleme mit den letzten beiden Punkten liegen offensichtlich am alten
    Compiler (CodeWarrior Version 8.0), aber ich habe ja jetzt eine Lösung.

    DJohn


Anmelden zum Antworten