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 toGL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
    tmp/build/triangle.o: In function glTriangleVertex::glTriangleVertex(glScene*, glTriangle*, int, int, int, bool)': triangle.cpp:(.text+0xdd): undefined reference toGL_VERTEX<glTriangleVertex>::GL_VERTEX(glScene*, int, int, int, bool)'
    collect2: ld gab 1 als Ende-Status zurück
    make: *** [conceptED] Fehler 1

    Die 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?


Anmelden zum Antworten