//template member funktion
-
Hallo
Folgendes Problem. In einer Klasse MyKernelAccess habe ich zum erzeugen beliebiger MyArray< T > Klassen eine Template Methode implementiert.
Eine andere Template-Klasse "MyController" hat eine Instanz der MyKernelAccess Klasse. Jedoch kommen bei Nutzung der template Methode unten genannte Fehler. Komisch ist jedoch, dass der Aufruf über eine lokale Instanz im Gegensatz zur Member-Instanz keine Fehler wirft.
Woran liegt das? Irgendwie habe ich noch was von Besonderheiten bei Member-Template-Methoden im Hinterkopf. Wie kann ich das Problem umgehen? Denn ich brauche im richtigen Code Daten aus der Membervariable, möchte aber auf die Flexibilität des Template snicht verzichten (die Float, Dummy Implementierung sind nur zwei von vielen möglichen).[edit: bsp: gekuerzt]
template< typename T> class MyArray{ public: T a; }; struct MyDummyClass{}; //Hauptklasse class MyKernelAccess { public: template< typename T > MyArray< T > createTemplate(){return MyArray< T >();} }; template< typename T> class MyController { protected: MyKernelAccess controller; public: void create() { MyKernelAccess scopeController; scopeController.createTemplate<MyDummyClass>(); scopeController.createTemplate<float>(); this->controller.createTemplate<MyDummyClass>(); //Fehler: expected primary-expression before ">" token //Fehler: expected primary-expression before ")" token this->controller.createTemplate<float>(); //Fehler: expected primary-expression before float //Fehler: expected `;' before "float" //ABER FOLGENDES FUNZT: controller.createTemplate<MyDummyClass>(); controller.createTemplate<float>(); } }; int main() { MyKernelAccess scopeController; scopeController.createTemplate<MyDummyClass>(); scopeController.createTemplate<float>(); }Kann mir einer diese Fehlermeldung schöüssig erklären und evtl einen guten Lösungsvorschlag liefern. Der MSVC Compiler schluckt das natürlich wieder mal (mit Ausnahme der nicht vorhandenen Methoden). Aber beim gcc 4.x gibt es mecker! Vermutlich Zurecht!
-
habe noch etwas weiter getestet:
wenn ich "this->" weglasse, dann gibt es keinen Kompilerfehler!also
controller.createDummy(); controller.createFloat(); controller.createTemplate<MyDummyClass>();anstatt
this->controller.createDummy(); this->controller.createFloat(); this->controller.createTemplate<MyDummyClass>();Wieso???
-
Die Templatemethode sollte so schon stimmen.
Was folgende Zeile angeht:
createDummy1()ist tatsächlich nicht in der Klasse.
scopeController.createDummy1();Was das
thisanbelangt, da scheint etwas mit dem Compiler nicht in Ordnung zu sein.
-
naja, es ist der gcc 4.2. die andere methode gibt es nicht. das ist korrekt... aber es wurde eben kein fehler angezeigt.
jedoch ist der reale code etwas komplexer und beihnaltet viele typedefs und traits... mal schauen, ob es jetzt funktioniert! das mit dem this zeiger hat mich schon arg verwundert!