krudes Member-Template Problem
-
Hallo,
ich glaube heute ist wieder mal einer dieser Tage...aber seht selbst:
geht:
template <typename T> class Foo{ public: template <typename X> void doX(){ } template <typename Y> void doY(Y y){ y.doX<int>(); } }; int main(int argc, char *argv[]){ return 0; }geht nicht:
template <typename T> class Foo{ public: // template <typename X> // void doX(){ // // } template <typename Y> void doY(Y y){ y.doX<int>(); } }; int main(int argc, char *argv[]){ return 0; }G++ 4.2.4 sagt:
test.cpp: In member function »void Foo<T>::doY(Y)«:
test.cpp:12: Fehler: expected primary-expression before »int«
test.cpp:12: Fehler: expected `;' before »int«Warum nur meint der Compiler, doX() in der Klasse Foo suchen zu müssen? Warum zur Hölle wir das Template überhaupt instanziiert?
-
...
Wenn du in der Klasse Foo die Methode doX aufrufst, wird der Compiler wohl danach suchen müssen?...
-
Theoretisch müsste er es nicht instanzieren, aber IIRC darf dein Compiler da eine Instanzierung machen. VC geht.
Leider habe ich jetzt keine Zeit mehr, sonst würde ich die genaue Stelle im Standard nachschlagen..
-
drakon schrieb:
Theoretisch müsste er es nicht instanzieren, aber IIRC darf dein Compiler da eine Instanzierung machen. VC geht.
Darf er? Mit was denn? Der Compiler weiss doch weder was T noch Y ist?!
-
eventuell hast du ein template vergessen:
y.template doX<int>();der msvc braucht das imho nicht unbedingt, aber andere Compiler kommen imho nicht ohne aus...
bb
-
unskilled schrieb:
eventuell hast du ein template vergessen:
y.template doX<int>();Bis eben wusste ich nichtmal, dass es dieses Sprachkonstrukt gibt

Aber ja, so geht das tatsächlich.
Da das allerdings so exotisch ist (zumindest hab ichs in ~10 Jahren C++ nie gesehen), frage ich mich, wieviele Compiler tatsächlich damit klarkommen...wobei scheinbar sogar der g++ 2.95.1 damit klar kommt...
-
ich kenn keinen, der es nicht kann - kann ich mir auch schwer vorstellen...
ich habs zwar auch noch nie gebraucht und kenn es nur aus dem forum aus paar fragen, aber als exotisch würd ich das jz nicht bezeichnen...
bb
-
maximAL schrieb:
zumindest hab ichs in ~10 Jahren C++ nie gesehen
Wieviele Jahre davon hast du dich ernsthaft mit Templates beschäftigt? Das Konstrukt ist Standard bei Aufruf von Memberfunktionstemplates.
-
pumuckl schrieb:
maximAL schrieb:
zumindest hab ichs in ~10 Jahren C++ nie gesehen
Wieviele Jahre davon hast du dich ernsthaft mit Templates beschäftigt? Das Konstrukt ist Standard bei Aufruf von Memberfunktionstemplates.
Womöglich liegts auch einfach daran, dass ich die längste Zeit tatsächlich mit MSVC gearbeitet hatte

Zumal das ganze auch nur dann nötig ist, wenn man die Funktion wiederum aus einem anderen Template aufruft.
-
maximAL schrieb:
Zumal das ganze auch nur dann nötig ist, wenn man die Funktion wiederum aus einem anderen Template aufruft.
Um genau zu sein ist es immer dann nötig, wenn du eine Templatefunktion eines templatetypen aufrufen willst. Die Begründung dafür ist, dass der compiler bei einem templatetyp nicht sagen kann, was "y.dox" ist. Dies ist aber für die Interpretation des Codes verdammt wichtig, weil die templatesyntax nicht kontextfrei ist. Der Standard sagt: ohne "template" davor ist es eine Variable. Also wird "dox" als Wert genommen, das "<" als operator< interpretiert, und beim nachfolgenden "int>" geht das Ganze dann endgültig schief.