template class soll erben
-
Der Sinn von Templates ist doch gerade, daß eben nicht zwingend eine Ableitungsbeziehung vorhanden sein muß - solange es kompiliert paßt der übergebene Typ.
-
mael15 schrieb:
A<Z> soll also garnicht erst möglich sein.
Hast du das mal übersetzt?
-
sorry, isst echt schwer die korrekten worte dafür zu finden.
ich dachte, es müsste doch möglich sein, dass A<Z> gar nicht erst kompiliert?
vielleicht ist ein template nicht das richtige in diesem fall?
-
mael15 schrieb:
sorry, isst echt schwer die korrekten worte dafür zu finden.
ich dachte, es müsste doch möglich sein, dass A<Z> gar nicht erst kompiliert?
vielleicht ist ein template nicht das richtige in diesem fall?manni66 schrieb:
mael15 schrieb:
A<Z> soll also garnicht erst möglich sein.
Hast du das mal übersetzt?
-
manni66 schrieb:
Hast du das mal übersetzt?
ich vermute du meinst, dass das mit is_base_of erledigt wäre?
-
ich versuche es nochmal ausführlicher:
struct X
{
int ziel;
};struct Y : X
{};struct Z : X
{};template<typename T>
struct A
{
int holeZiel(){ return T.ziel; } // DAS soll möglich sein
};int main()
{
A<Y> a1;
A<Z> a2;
}
-
mael15 schrieb:
int holeZiel(){ return T.ziel; } // DAS soll möglich sein
Das ist selbstverständlich nicht möglich. Was soll T.ziel denn auch sein?
-
manni66 schrieb:
Das ist selbstverständlich nicht möglich. Was soll T.ziel denn auch sein?
in meinem konkreten fall will ich, dass alle vom template erbenden klassen ein bitmap haben und ich würde gerne mit dem bitmap in einer template funktion arbeiten.
aber dann muss ich wohl mit normaler vererbung ohne templates arbeiten, schade.
danke!
-
Dann muss deine Template Klasse halt ein Bitmap haben
Pseudo Code:template<class T> class Base{ protected: Bitmap bitmap; }
Dann haben alle Klassen, die von Base ableiten auch das Bitmap. Und du kannst in den Funktionen jeweils darauf zugreifen.
Die Frage ist, was genau willst du mit dem Template anstellen?
-
mael15 schrieb:
in meinem konkreten fall will ich, dass alle vom template erbenden klassen ein bitmap haben und ich würde gerne mit dem bitmap in einer template funktion arbeiten.
aber dann muss ich wohl mit normaler vererbung ohne templates arbeiten, schade.
danke!Du scheinst templates nicht verstanden zu haben. Du brauchst ein Objekt vom Typ T, z.B.
template<typename T> struct A { T aT; int holeZiel(){ return aT.ziel; } };
-
okay, ich muss es noch konkreter beschreiben, ich habe mein problem nicht gut abtrahiert, sorry!
template<class T> class PageContainingBundleImages { public: void addBundleImage(libdf::DBundle *bnd) { getBundleImages()->push_back(new T(bnd)); } std::vector<T*>*getBundleImages() { return &bundleImages; } protected: std::vector<T*>bundleImages; };
jedes T erbt ein bitmap, hat aber selber noch weitere andere member. mit dem bitmap will ich in der template klasse arbeiten. nur weiß die template klasse ja nicht, dass das bitmap in jedem T existiert...
EDIT: das feature schein in arbeit zu sein, dann muss ich wohl geduld haben. siehe "concepts" weiter unten auf der seite http://en.cppreference.com/w/cpp/language/constraints
-
mael15 schrieb:
jedes T erbt ein bitmap, hat aber selber noch weitere andere member. mit dem bitmap will ich in der template klasse arbeiten. nur weiß die template klasse ja nicht, dass das bitmap in jedem T existiert
Code und Text haben bei dir nie wirklich einen Zusammenhang.
Wie gesagt, du scheinst templates nicht verstanden zu haben.#include <iostream> struct X { int bitmap = 2; }; struct Y : X { }; template<typename T> struct A { T aT; int bitmap() { return aT.bitmap; } }; int main() { A<Y> a1; std::cout << a1.bitmap() << '\n'; }
-
okay, cool, ich hätte nicht gedacht, dass das so einfach ohne explizite definition funktioniert. super, danke!
vielleicht hätte ich es einfach mal stumpf ausprobieren sollen vorher