Template
-
Ich möchte ja eine Template-Funktion programmieren!
So habe ich das versucht:CFont.h
Code:class IFont { public: static IFont* Create(void); void Release(void); virtual void Func1(void)=0; virtual void Func2(void)=0; }; class CFont2:public IFont { private: int HAHS; public: virtual void Func1(void); virtual void Func2(void); };
und dann in der CFont.cpp
Code:#include "CFont.h" #include <iostream> template <class T1> T1* Create(void) { return new T1; } IFont* IFont::Create(void) { return Create<CFont2>(); } void IFont::Release(void) { delete this; } void CFont2::Func1(void) { std::cout<<"Func1\n"; } void CFont2::Func2(void) { std::cout<<"Func2\n"; }
Dort meldet er mir beim kompilieren diesen Fehler:
Kompilierung läuft...
CFont.cpp
D:\Programmierung\Testing\templates\CFont.cpp(12) : error C2275: "CFont2" : Ungültige Verwendung dieses Typs als Ausdruck
d:\programmierung\testing\templates\cfont.h(11) : Siehe Deklaration von 'CFont2'
D:\Programmierung\Testing\templates\CFont.cpp(12) : error C2059: Syntaxfehler : ')'
Fehler beim Ausführen von cl.exe.templates.exe - 2 Fehler, 0 Warnung(en)
-
Hallo,
das Problem hatten wir gerade erste. Es hat auch nichts mit Templates zu tun:return Create<CFont2>();
Da es im Scope der Klasse IFont (in dem dich befindest) eine Methode Namens Create gibt, steht die globale Funktion nicht für Überladung zur Verfügung. Es wird also versucht die Methode der Klasse aufzurufen. Die ist kein Template -> Fehler.
Lösung:
return ::Create<CFont2>();
Durch die Qualifizierung mit :: machst du dem Compiler klar, dass es sich bei Create nicht um die Methode der Klasse handelt sondern um eine globale Funktion.
Zum Thema: Templatedefinition in cpp-Datei schau nochmal hier:
Template in 2 Dateien
-
oh man! Da hätte ich auch selber draufkommen können! Also hätte ich obigen Besipiel eine Rekursion gemacht, oder?
-
Also hätte ich obigen Besipiel eine Rekursion gemacht, oder?
Wenn es sich bei Create um ein Membertemplate handelt würde, ja.
So ist es, wie du siehst, nur ein Syntaxfehler