undefined reference to....
-
Hallo!
Das Problem: Eine von QGraphicsItem abgeleitete Klasse erstellt in ihrem Konstructor Instanzen von sich selbst (this->r = new MyGraphicsItem). Um Items, die sich identisch verhalten, aber anders aussehen zu erhalten, leite ich diese Klasse ab. Jedoch werden jetzt in dem Konstruktor einer weiteren geerbten Klasse (zB MyGraphicsItemEnkel *g*) sondern immernoch die von MyGraphicsItem erstellt!
Lösungversuch: Erstellen einer Template-Klasse die von QGraphicsItem (QGraphicsItem ist nötig da auch schöne sachen wie ItemChange() behandelt werden sollen) abgeleitet ist:template<class T> class GL_VERTEX : public QGraphicsItem { public: GL_VERTEX(glScene*, int, int, int, bool init = true); /*protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); */ private: T *r; T *l; }; template<class T> GL_VERTEX<T>::GL_VERTEX(glScene *GLScene, int x, int y, int z, bool init) { setPos(QPointF(x, y)); setZValue(z); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); GLScene->addItem(this); if(init) { T *sideItem = new T(GLScene->side, z, y, x, false); T *topItem = new T(GLScene->top, x, z, y, false); this->r = sideItem; this->l = topItem; sideItem->r = topItem; sideItem->l = this; topItem->r = this; topItem->l = sideItem; } GLScene->update(); }
Eine (von MEHREREN) von GL_VERTEX abgeleiteten Klassen sieht so aus:
class glTriangleVertex : public GL_VERTEX<glTriangleVertex> { public: glTriangleVertex(glScene*, glTriangle*, int, int, int, bool init = true); /*protected: QRectF boundingRect() const; void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget*); */ private: glTriangle *object; }; glTriangleVertex::glTriangleVertex(glScene *scene, glTriangle *object, int x, int y, int z, bool init) : GL_VERTEX<glTriangleVertex>::GL_VERTEX(scene, x, y, z, init) { this->object = object; scene->triangles.append(this); }
Das Resultat sieht so aus:
tmp/build/triangle.o: In function
glTriangleVertex::glTriangleVertex(glScene*, glTriangle*, int, int, int, bool)': triangle.cpp:(.text+0x5d): undefined reference to
GL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
tmp/build/triangle.o: In functionglTriangleVertex::glTriangleVertex(glScene*, glTriangle*, int, int, int, bool)': triangle.cpp:(.text+0xdd): undefined reference to
GL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
collect2: ld gab 1 als Ende-Status zurück
make: *** [conceptED] Fehler 1Die GL_VERTEX template Klasse und glTriangelVertex befinden sich in 2 verschiedenen dateien und der header ist natürlich eingebunden ^^
Das ist meine erste (nach ein paar einfachen versuchen) Erfahrung mit templates... was ist da falsch? Oder ist das Konzept schon schlect?
THX!
-
Wenn ich nun meine Template-Klasse in die Datei von glTriangleVertex schreibe (was NICHT von dauer sien soll) tritt ein anderer Fehler auf:
src/triangle.cpp:17: Fehler: es kann kein Objekt des abstrakten Typs »glTriangleVertex« belegt werden
... was sich wohl zweifelsfrei auf den Konstruktor von GL_VERTEX zurückführen lässt:
T *sideItem = new T(GLScene->side, z, y, x, false); T *topItem = new T(GLScene->top, x, z, y, false);
Darf ich das etwa nicht machen? Dann wäre der Lösungansatz falsch und es handelt es sich um ein reines C++ Problem?