Spezialisierung eins template operators in den globalen namespace importieren
-
Hallo!
Ich habe eine template Funktion und einen template Operator in einem namespace:
namespace detail { template <typename T> T func(T t) { return t; } template <typename T> T operator~(T t) { return t; } }Beides möchte ich spezialisiert für ein scoped Enum in den globalen namespace importieren:
enum class type { }; type (&func)(type t) = detail::func<type>; type (&operator~)(type t) = detail::operator~<type>;Bei der Funktion funktioniert das auch wunderbar, jedoch bekomme ich bei dem Operator folgende Fehlermeldung:
% g++ -std=c++11 test.cpp && ./a.out test.cpp:21:25: error: declaration of ‘operator~’ as non-function type (&operator~)(type t) = detail::operator~<type>;Offenbar geht das so nicht. Mache ich etwas falsch oder gibt es vielleicht noch eine andere Möglichkeit?
Vielen Dank im Voraus!
-
Offenbar geht das so nicht.
Nein, leider nicht. Du musst den Operator für
typeüberladen:type operator~(type t) { return detail::operator~(t); }
-
Importeur schrieb:
Beides möchte ich spezialisiert für ein scoped Enum in den globalen namespace importieren:
enum class type { }; type (&func)(type t) = detail::func<type>; type (&operator~)(type t) = detail::operator~<type>;Interessante Idee. Allerdings würde func nicht per ADL gefunden werden können, was ggf. später für Überraschungen sorgt. Und operator-ids können nur für Funktionen verwendet werden, nicht Variablen.
Unproblematisch wäre es, einfach Funktionen zu schreiben, die deligieren.
auto func(type t) { return detail::func(t); } auto operator~(type t) { return detail::operator~(t); }evtl. kommen auch using-Deklarationen in Betracht, die sind dann aber nicht auf eine einzelne Spezialisierung beschränkt.
-
kommen auch using-Deklarationen in Betracht.
Nein,
using-Deklarationen können nur unqualified-ids in Namensräumen nennen, nicht Spezialisierungen von Templates.Explizite Instantiierungen gehen leider auch nicht da diese im selben Namensraum stehen müssen.