Operator Template in Klasse
-
Hallo,
class A { public: template <typename T> bool operator()(const std::string& str) { } };Wenn ich den Operator jetzt benutzen möchte:
A instance; if (instance<int>("test")) { }Bekomme ich die Fehlermeldung vom Compiler, das er erst eine "primary expression" vor dem '<' Token erwartet. Wenn ich es so schreibe:
instance.operator()<int>("test")... tritt der Fehler nicht mehr auf.
- Wieso tritt dieses Verhalten auf?
- Wie kann ich das so hinkriegen "wie ich es will"?
Grüße
-
1. Weil instance kein Template ist.
2. Garnicht. Operatoren kannst Du nicht templatisieren, es seidenn der Template-Parameter kann deduziert werden, weil T in der Parameterliste des Operators vorkommt.
-
Zur Deduzierung kannste bspw. ein identity-Template o.ä. verwenden:
template <typename T> struct identity {using type = T;}; class A { public: template <typename T> bool operator()(identity<T>, const std::string& str) { } }; .... instance(identity<int>{}, "test")ggf. identity schöner nennen, so dass das semantisch mehr Sinn macht.
-
Danke für die Antworten.
using type = T;... was bewirkt das?
-
asadsad schrieb:
Danke für die Antworten.
using type = T;... was bewirkt das?
typedef T type;
-
asadsad schrieb:
Danke für die Antworten.
using type = T;... was bewirkt das?
Das ist die neue Version eines typedefs in C++11. Äquivalent zu typedef T type.
Ist hier auch nicht notwendig, nur der vollständig halber, weil man identity auch nutzen kann, wenn man keine Deduktion haben möchte:
template <typename T> void deduced(T t); template <typename T> void non_deduced(typename identity<T>::type t);Weil der Compiler nicht wissen kann, ob identity spezialisiert ist, kann er T nicht deduzieren.