Operator<< als template Funktion überladen
-
Hi
Bei dem Folgenden code
class a { virtual template<class T> a operator<< (T& b); };
Bringt der Compiler mir 2 Syntaxfehler. Wenn ich das virtual weglasse dann ist der Fehler weg. Kann man operatoren nicht mit virtuell definieren oder liegt es daran dass es eine Template Funktion ist.
Woran kann das liegen.
-
davon abgesehen, dass ich nicht weiß wie es funktionieren sollte, probiers mal mit virtual _hinter_ dem template<..>
-
virtual und template verträgt sich nicht miteinander. Das hat damit zu tun, dass die Tabelle der virtuellen Funktionen (vtbl) fest sein muß. Bei Templates würde sie sich aber bei jeder neuen Instanziierung ändern. Im Grunde liegts also am Übersetzungsmodell von C++, mal wieder
-
Im Grunde liegts also am Übersetzungsmodell von C++, mal wieder
Tatsächlich? Ich lese immer, dass das diese Einschränkung eher "by-design" ist und das technische Gründe eher nebensächlich sind (gut, mit der Effizienz klappt's nicht so). Besonders, da der vtable-Ansatz a) nicht vorgeschrieben ist und b) virtuelle Template nicht generell ausschließt.
Why a function template cannot be a virtual function?
Naja, eine Suche in clc++m liefert noch unzählige andere Beiträge. Inklusive möglicher Workarounds, für den Fall, dass man tatsächlich mal virtuelle template-Funktionen braucht.
-
Ähm, tut mir leid, aber die beiden von dir geposteten Links enthalten hauptsächlich technische Gründe für das Verbot von virtuellen Templatefunktionen, sowie anfänglich (im ersten Thread) eine falsche Argumentation von einem gewissen Rob bezüglich nicht-technischer Gründe.
-
Hm,
ich habe die beiden Diskussionen nicht mehr im Kopf. In den letzten Diskussionen zum Thema kam meines Wissens aber immer raus, dass es sich bei virtuellen Template-Memberfunktionen aus technischer C++ Sicht nicht um ein *grundsätztlich* unmögliches Ding handelt. Vielmehr nur, dass sie a) nicht so furchtbar sinnvoll sind und dass es b) schwierig (im Gegensatz zu "nicht machbar wegen C++ Übersetzungsmodell") ist, sie effizient zu implementieren.Mein Einwand kam hauptsächlich auch nur, da ich mich an eine frühere Diskussion erinnerte, die *hier* geführt wurde und in der u.A. ich behauptet habe, virtuelle Templatefunktionen seien aufgrund der vtable nicht machbar.
-
Achso. Im C++ Kontext rückt der Begriff "nicht effizient implementierbar" allerdings meistens sehr in die Nähe von "unmöglich", insbesondere wenn das entsprechende Feature für nicht besonders sinnvoll gehalten wird.