Gegenseitiges Includen zweier Klassen; (eine Klasse ist eine template class)



  • Ich habe eine template Klasse Vektor und eine Klasse Point. Und beide sollen entsprechende Kopierkonstruktoren erhalten um sich gegenseitig umzuwandeln.
    In der Klasse Vektor, kann ich leider nicht pre-deklarieren, weil die Implementation in der selben Datei stehen muss wie die Definition. deshalb binde ich den Header für Point direkt ein (entsprechendes wurde auskommentiert):

    //#include "Point.h"
    
    namespace MATH {
    
    template <class T>
    class Vec3 : public Vector<T> {
    	template<class> friend class Vector;
    
    public:
    	Vec3();
    	Vec3(const T &x, const T &y, const T &z);
    	Vec3(const Vector<T> &vector);
    	Vec3(const Vec3<T> &vector);
    	//Vec3(const Point &point);
    

    In der Klasse Point habe ich probiert durch predeklaration in der definition und includierung in der implementation typdefinitionsfehler(oder wie das heißt) zu vermeiden:

    class Point {
    	template<class> class Vec3; // pre-deklaration
    
    public:
    	Point( float x = 0, float y = 0, float z = 0 );
    	Point( const Vec3<float> & );
    
    Point::Point(const Vec3<float> &vector) {
    	m_fX = vector.X();
    	m_fY = vector.Y();
    	m_fZ = vector.Z();
    }
    

    Ich bekomme jedoch den fehler dass die predeklaration incomplete ist, wobei dem compiler sowas doch egal sein kann.

    ../src/Point.cpp: In constructor ‘Point::Point(const Point::Vec3<float>&)’:
    ../src/Point.cpp:19: error: invalid use of incomplete type ‘const struct Point::Vec3<float>’
    ../src/Point.h:12: error: declaration of ‘const struct Point::Vec3<float>’
    ../src/Point.cpp:20: error: invalid use of incomplete type ‘const struct Point::Vec3<float>’
    ../src/Point.h:12: error: declaration of ‘const struct Point::Vec3<float>’
    ../src/Point.cpp:21: error: invalid use of incomplete type ‘const struct Point::Vec3<float>’
    ../src/Point.h:12: error: declaration of ‘const struct Point::Vec3<float>’
    

    Die einzige möglichkeit, das problem zu umgehen scheint zu sein, dass man den header für den vektor hier auch in der definition inkludiert.

    allerdings funktioniert, dass wegen der kreisförmigen includierung leider nur in einer der beiden klassen ):



  • Mir stellt sich da die Frage, wieso man eine Template-Klassen-Instanz (!) für Vektoren einer Nicht-Template-Klassen-Instanz für Punkte zuweisen können sollte.



  • naja, eigentlich macht das wirklich nur in eine richtung sinn.



  • gentoo schrieb:

    Ich habe eine template Klasse Vektor und eine Klasse Point. Und beide sollen entsprechende Kopierkonstruktoren erhalten um sich gegenseitig umzuwandeln.

    Du verwechselst da was: Kopierkonstruktoren nehmen ein Parameter des eigenen Typs als (Const-)Referenz. Du meinst wohl eher einen Konvertierungskonstruktor (wobei dieser Begriff nicht sehr häufig anzutreffen ist).



  • class Point {
    	template<class> class Vec3; // pre-deklaration
    

    Du deklarierst hier eine Klasse Point::Vec3, definierst aber nur Vec3. Die Forward-Deklaration muss ausserhalb der Klasse stehen.

    template<class> class Vec3;
    class Point {
    

Anmelden zum Antworten