Archiv verlassen und diese Seite im Standarddesign anzeigen : Template Problem
ich hab noch ein problem für fortgeschrittene ... und zwar mit templates ... wenn ich den body der funktion kill direkt in der Klasse definiere funzt es .. aber wieso nicht außerhalb (via Klasse::Funktion ) .. was mach ich da falsch?
hier ein bsp um mein problem zu verdeutlichen :
#include <windows.h>
#include <stdio.h>
class CMaster
{
public:
template <class X>void kill(X *&ttt);
};
class CTest
{
public:
CTest() {};
~CTest() {};
};
class CDeriv : CTest
{
public:
CDeriv() {};
~CDeriv() {};
};
template <class X> void CMaster::kill(X *&ttt)
{
delete ttt;
}
int main(int argc, char* argv[])
{
CDeriv *a = new CDeriv;
CMaster master;
master.kill(a); // <-darüber mäkelt der compiler
return 0;
}
ich habs zwar erstmal anderst gelöst .. gefällt mir aber nicht :(
Hi
boah das Problem bringt mich noch zum Ausrasten..
aber mal ruhig bleiben leute..
es wird scho funzen
cu
ALPHAvx
Hi
boah das Problem bringt mich noch zum Ausrasten..
aber mal ruhig bleiben leute..
es wird scho funzen
cu
ALPHAvx
Hast du schon mal probiert, kill als "inline void" zu deklarieren? Oder nur "void CMaster::kill(X *&ttt)" schreiben, oder "void CMaster::template <class X> kill(X *&ttt)"... Was für einen Fehler bringt er denn?
inlien bringt nichts , außerdem möchte ich es auch net als inline code da er reletiv häufig aufgerufen wird ... dir beiden von dir vorgeschlagenen Varianten gehn auch nicht (hab das alles schon probiert) .. Die genau Compilerfehlermeldung ist : error C2893: Funktionsvorlage 'void __thiscall CMaster::kill(X *& )' konnte nicht spezialisiert werden ...
Ich dachte dass es was mit inline zu tun hat, weil direkt in der klasse definierte methoden immer inline sind. Kann es sein, dass du für <class X> irgendwie einen Typ angeben musst? btw was bedeutet eigentlich X *&ttt? Zeiger auf Referenz??
@toxic:
Das kenne ich auch nicht. Entweder '*' oder '&'. Ich habe noch keinen Quellcode mit '*&' gesehen (was natürlich nichts bedeutet)
/*
Ich kann dir erkären warum dein source nicht funktioniert und dir eine alternative bieten, aber die lösung deines problems kenn ich nicht.
erstmal die alternative. du willst eine klasse löschen.(bsp. only). eine klasse jhat genauso wie jede andere varibale einen pointer,(weisst du sicher).
du kannst diesen pointer und alle anderen auch mit typ (void*) "darstellen". dazu musst du auch nicht von int z.b. nach (void*) typecasten.
das wäre eine möglichkeit um deine kill() funktion variabel zu machen, falls das dein ziel war. ich halte sowieso nicht viel von templates.*gg*
dein problem mit dem source ist folgendes. du versuchst die mit deiner syntax: "template <class X> void [BLAH]::kill(X*&)" nicht die funktion BLAH::kill(X*&),
mit dem template zu versehen sondern die ganze klasse. (siehe bsp. weiter unten). das ist dein fehler. die lösung, falls es eine gibt, liegt sicher darin
zu versuchen nicht die ganze klasse, sondern nur die funktion mit dem template zu versehen, aussderm hast du noch beim aufruf der funktion ::kill(...) die <type> vergessen.(glaube ich)
muesste nämlich heissen: ::kill<B>(b);
ich hoffe ich konnte dir helfen...
etuli, GBMX
http://www.gbmx.de
*/
#include <stdio.h>
class A
{
public:
int a;
};
class B : A
{
public:
int b;
};
/*class C // bsp 1: die alternative
{
public:
void kill(void*);
}
void C::kill(void *ptr)
{
delete ptr;
}
void main()
{
B *b = new B;
C c;
c.kill(b);
}*/
template <class X> // bsp 2: der fehler (das funktioniert!)
class C
{
public:
void kill(X*);
};
template <class X> void C<X>::kill(X*x)
{
delete x;
}
void main()
{
B*b = new B;
C<B> c;
c.kill(b);
}
erstmal : danke für eure hilfe ;)
nun aber nochmal zum Problem :(
@ MDk *& ist eine Referenz von/auf den übergebenen Pointer .. was sehrwohl funzt
und auch nicht total unüblich ist.Hier die Erklärung wieso ich es nutze:
da ich den Übergebenen Pointer direkt in der Funktion beeinflussen will (zB: alte Klasse löschen,
neue andere! erstellen) nutze ich eine Referenz (wenn du möchtest poste ich mal ein Bsp wieso das wichtig ist)
@ toxic ... direkt in der Klasse definiert Methoden sind nicht immer Inline .. trotzdem thx für
die Idee (hätte es ja sein können)
@ etuli .. vielen dank für deine Mühe ..
zur Alternative.. ja ich weiß das natürlich mit (void*) *g* ...
aber probier das mal mit einer Klasse die ihren eigenen Destruktor mit bringt
... wenn du nämlich via (void*) typcastest übergehts du damit einfach diesen destruktor!
(wäre delete (void*)b ) ...
zum zweiten : nunja ich will ja wie du erkannt hast NICHT die ganze Klasse
mit einem Template versehen sondern nur EINE Funktion der Klasse
(da es ja keine Klassenvorlage werden soll ... hab das auch schon probiert ..
aber es würde GARNICHTS bringen ... da es ja keine Klassenvorlage sein DARF -
da zum Zeitpunkt der definiton der Klassentyp noch nicht bekannt ist ..
was ja bei einer Templateklasse vorraussetzung wäre) .. in der Hilfe steht ja konkret drin wie die
Syntax dazu aussieht (für einzelne Funktionen .. nur halt nicht Funktionen in Klassen) ...
folgendes geht ja :
template <class X> void killohneklasse(X*x)
{
delete x; // Der richtige Destruktor wird aufgerufen
}
.. kein Fehler ...
killohneklasse(b); //geht genauso wie
killohneklasse<B>(b);
// aber
c.kill<B>(b); // dachte auch erst .. ach einfach nur <B> vergessen -
// doch der Compi bringt einen anderen Fehler : "B" : Ungültige Verwendung dieses Typs als Ausdruck
[Dieser Beitrag wurde von dynamix am 19. August 2000 editiert.]
also liegt es nicht daran ... sondern an der Syntax für die Definition
einer Vorlage für eine Funktion die Member ein Klasse ist. Die is irgendwie ..
kA .. falsch ... ich hoffe das geht überhaupt ... hmmm ... es geht ja wenn ich es direkt in der Klasse definiere
.. wieso nicht außerhalb .. ich hab nicht die geringst logische erklärung dafür .. den
class CMaster
{
public:
template <class X>void kill(X *&ttt)
{
delete ttt;
}
};
geht ja! .. doch da ich meine Klassendefinitonen alle in Headerfiles hab würde der Code
ja auch in einem Headerfile landen .. wo er a) nichts zu suchen hat
b)ich jedesmal bei eine änderung am code sämtliche Sourcen die das Headerfile nutzen
neucompilieren muss c) ich bei einer änderung am diesem Code unter VC++ DAS komplete Projekt
neu erstellen muss da sich das Headerfile ja nicht compilieren läßt *g* .. ( hab nämlich was am code geändert
.. und hab mich so ca 20min gewundert wieso keine meiner Änderungen irgendeine wirkung zeigt
/ und der Debugger net mehr da hält wo er sollte *zzz* ) ...
aber trotzdem danke an euch alle für die Ideen *g* .. habt echt was drauf ..
da sieht man was für eine hohes niveau einige Leute hier habe :) :) :)
.. doch leider sitze ich immer noch auf meinem Problem :( :(
ich werd wohl einen C++ Guru anbeten müssen ;) oder mein kompletes Konzept für das proggy ändern
(wieso zwei postings? .. weil immer ein internal server error kam wenn ich es als ein ganzes posten wollte)
[Dieser Beitrag wurde von dynamix am 19. August 2000 editiert.]
in meinem C++ Buch steht, dass "Methoden von Klassen, die innerhalb der Klasse definiert werden, vom Compiler automatisch als inline-Funktionen behandelt" werden.. Stimmt das jetzt oder nicht? Wenn ja, dann sollte man innerhalb der Klasse keine allzu großen Funktionen definieren.
laut c++ referenz hast du doch recht! (ich dachte bei dem was ich sagt zB an virtuelle o. auch statische Funtkionen)
-----
If a member function is defined inside a class declaration, it is treated as an inline function, and there is no need to qualify the function name with its class name. Although functions defined inside class declarations are already treated as inline functions, you can use the inline keyword to document code.
-----
allerdings ist das nicht der Grund wieso es nicht geht ... leider ...
so problem gelöst ;) falls das jemanden interressiert .. es liegt daran das man mit templates keine dynamisch Polymorphen Funktionen schreiben kann (hoffentlich werden zukünftige Compiler sowas ermöglichen)... hab die Template funktion dann als friend der Klasse deklariert .. was aber auch nichts brachte .. hab ein einfache Lösung übersehen nämlich den destkruktor einfach virutell zu machen ;) .. (das geht weile alle Klassen zu selben KlassenHierachie gehören .. uff)