partielle Spezialisierung von Template-Member-Funktionen
-
template< typename T, typename U> class bar { void foo(T t, U u); }; template< typename T, typename U> void bar<T, U>::foo(T t, U u) // :) { } template<> void bar<int, float>::foo(int t, float u) // :) { } template< typename U> void bar<int, U>::foo(int t, U u) // :( { }
Der dritte Fall geht nicht. Kann man sowas irgendwie anders machen?
-
Hallo,
(Member-)Funktionen kann man nicht partiell spezalisieren.
Ohne deine genaue Situation zu kennen, würde ich hier erstmal eine partielle Spezialisierung der Klasse vorschlagen:template< typename T, typename U> class bar { void foo(T t, U u); }; template< typename U> class bar<int, U> { public: void foo(int t, U u); }; template<typename U> void bar<int, U>::foo(int t, U u) {} template< typename T, typename U> void bar<T, U>::foo(T t, U u) // :) { } template<> void bar<int, float>::foo(int t, float u) // :) { }
Vielleicht wäre aber auch ein Membertemplate + Überladung angebracht. Was genau willst du denn machen?
-
Mein Problem ist, dass je nach Typ von T nur eine der verschiedenen angebotenen Spezialisierungen verwendet werden darf, die anderen sollen zu Compilerfehlern führen. Überladung hilft nix, da von T (im echten Programm) keine Instanzen angelegt werden sondern es nur über expliziten Aufruf mit einer festen Auswahl von erlaubten Klassen ( foo<T_typeA>(3)) angesprochen wird.
Über Nacht ist mir aber die Idee zu kommen, dass ich das, was ich will mit ConzeptsConcepts erreichen kann.Danke!