probleme mit templateklasse



  • hi,

    ich habe leider arge Probleme mit dieser Kassenkonstruktion
    ich bekomme die Fehlermeldung:
    fatal error C1001: INTERNER COMPILER- FEHLER

    vorher hatte ich beim Konvertierungskonstruktor der abgeleiteten Klasse
    noch einen zweiten Parameter
    so: coords3D_c(coords2D_c<T> coords,T z) { /.../ this->z=z;}
    ich bekam den fehler:
    error C2504: 'coords2D_c<int>' : Basisklasse undefiniert
    ich dachte mir vielleicht liegt es daran, dass bei einem konv.konstruktor
    alle dem ersten Parameter folgenden weiteren Parameter einen Defaultwert haben müssen
    also: coords3D_c(coords2D_c<T> coords,T z = 0) { /.../ this->z=z;}
    das aber gibt den fehler wie oben

    hat jemand eine idee?

    tschao
    lukas

    // Forward-Deklarations:
    template <typename T> class coords2D_c;
    template <typename T> class coords3D_c;
    
    template<typename T> 
    class coords2D_c 
    {
    public: 
    	T x,y; 
    
    	coords2D_c() 
    	{ 
    		x=0; 
    		y=0; 
    		//printf("2D-Konstruktor\n");
    	}
    	virtual ~coords2D_c()
    	{//printf("2D-Destruktor ~\n");
    	}
    
    	//ConversationConstructor 
    	coords2D_c(coords3D_c<T> coords) 
    	{
    		x=coords.x; 
    		y=coords.y; 
    	} 
    
    	virtual coords2D_c<T> operator+(coords2D_c<T> coords) 
    	{ 
    		coords2D_c<T> sum; 
    		sum.x=x+coords.x; 
    		sum.y=y+coords.y; 
    		return (sum); 
    	} 
    	virtual coords2D_c<T> operator-(coords2D_c<T> coords) 
    	{
    		coords2D_c<T> diff; 
    		diff.x=x-coords.x; 
    		diff.y=y-coords.y; 
    		return (diff); 
    	}
    
    };
    
    template<typename T> 
    class coords3D_c:virtual public coords2D_c<T> 
    { 
    public:
    
    	T z; 
    
    	coords3D_c(): coords2D_c<T>() 
    	{
    		z=0; 
    		//printf("3D-Konstruktor\n");
    	}
    	virtual ~coords3D_c()
    	{	//printf("3D-Destruktor ~\n");
    	}
    
    	//ConversationConstructor 
    	coords3D_c(coords2D_c<T> coords) 
    	{ 
    		this->x=coords.x; 
    		this->y=coords.y; 
    		this->z=0; 
    	} 
    
    	virtual coords3D_c<T> operator+(coords3D_c<T> coords) 
    	{ 
    		coords3D_c<T> sum; 
    		sum.coords2D_c<T>::operator+(coords2D_c<T>(coords)); 
    		sum.z=z+coords.z; 
    		return (sum); 
    	} 
    	virtual coords3D_c<T> operator-(coords3D_c<T> coords) 
    	{ 
    		coords3D_c<T> diff; 
    		diff.coords2D_c<T>::operator-(coords2D_c<T>(coords)); 
    		diff.z=z-coords.z; 
    		return (diff); 
    	} 
    
    };
    


  • coords2D_c(coords3D_c<T> coords)
    

    coords3D_c ist zu dem zeitpunkt noch nicht vollständig bekannt, dh man darf nur zeiger oder referenzen auf die klasse haben, dh man darf nicht auf die elemente der klasse zugreifen, da sie zu dem zeitpunkt noch nicht bekannt sind.

    tipp: von basisklasse ableiten, dann klappt das auch 😉



  • dazu habe ich doch die Vorwärtsdeklarationen.
    mit denen sollte es doch eigentlich gehen oder?

    template <typename T> class coords2D_c; 
      template <typename T> class coords3D_c;
    

    und was meinst du mit "von basisklasse ableiten"
    das hab ich doch gemacht oder?? 😕

    template<typename T> 
      class coords3D_c:virtual public coords2D_c<T> 
      { /*....
    

Anmelden zum Antworten