Komplexeres Template-Problem



  • Hallo 🙂 🙂 🙂

    Ich bastel grad an ner Template-Klasse für n-Dimensionale Matrizen. Das Problem ist die Implementierung des operator*. Wenn man n bischen was über Matrizen weiß, weiß man ( 😃 ), dass man nur Multiplizieren kann, wenn die Zeilenzahl der ersten gleich der Spaltenzahl der zweiten ist. Die Spaltenzahl der ersten und die Zeilenzahl der zweiten sind egal. Das heißt aber, der operator* bräuchte 3 Parameter. Jetzt die Frage: Kann ich in ner Template-Klasse eine Template funktion mit anderen Template-Parametern haben? Ich zeig mal wie ichs mein:

    template <unsigned int uiCountM,unsigned int uiCountN> class sgCMatrix
    {
    	protected:
    		float m_aaf[uiCountM][uiCountN];
    	public:
    		inline sgCMatrix(void);
    		inline sgCMatrix(const float** aaf);
    		inline sgCMatrix(const sgCMatrix<uiCountM,uiCountN>& Matrix);
    		inline ~sgCMatrix(void);
    
    		//Get-functions:
    		inline float GetF(const unsigned int uiM,const unsigned int uiN) const;
    		inline float** GetAAF(void) const;
    
    		//Set-functions:
    		inline void SetF(const unsigned int uiM,const unsigned int uiN,const float f);
    
    		template <unsigned int uiCountN2> inline sgCMatrix<uiCountM,uiCountN2> operator*(const sgCMatrix<uiCountN,uiCountN2>& Matrix2);
        //Massig andere Operatoren...
    };
    

    Wobei operator* wie folgt definiert ist:

    template <unsigned int uiCountM,unsigned int uiCountN,unsigned int uiCountN2> 
    inline sgCMatrix<uiCountM,uiCountN2> sgCMatrix<uiCountM,uiCountN>::operator*(const sgCMatrix<uiCountN,uiCountN2>& Matrix2)
    {
    	sgCMatrix<uiCountM,uiCountN2> MatrixReturn;
    	for(int iLoopVariableFM=0;iLoopVariableFM<uiCountM;iLoopVariableFM++)
    	{
    		for(int iLoopVariableFN=0;iLoopVariableFN<uiCountN2;iLoopVariableFN++)
    		{
    			for(unsigned int uiLoopVar=0;uiLoopVar<uiCountN;uiLoopVar++)
    			{
    				MatrixReturn.m_aaf[iLoopVariableFM][iLoopVariableFN]+=
    					Matrix1.m_aaf[iLoopVariableFM][uiLoopVar]
    					*Matrix2.m_aaf[uiLoopVar][iLoopVariableFN];
    			}
    		}
    	}
    }
    

    Darauf antwortet der Compiler (Visual c++ 6.0) mit:
    e:\samuel\programmierung\c++\visualc++\directx\direct3d\projectmatrixvector\unitmain.cpp(12) : fatal error C1001: INTERNAL COMPILER ERROR
    (compiler file 'msc1.cpp', line 1786)
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information

    Weiß jemand nen anderen Lösungsansatz?
    Danke im Voraus!

    Samuel G.



  • Das geht, auch wenn das afaik aeltere Compiler unter Umstaenden nicht unterstuetzen. So kompiliert er bei mir:

    template <unsigned int uiCountM,unsigned int uiCountN> class sgCMatrix 
    { 
        protected: 
            float m_aaf[uiCountM][uiCountN]; 
        public: 
            inline sgCMatrix(void); 
            inline sgCMatrix(const float** aaf); 
            inline sgCMatrix(const sgCMatrix<uiCountM,uiCountN>& Matrix); 
            inline ~sgCMatrix(void); 
    
            //Get-functions: 
            inline float GetF(const unsigned int uiM,const unsigned int uiN) const; 
            inline float** GetAAF(void) const; 
    
            //Set-functions: 
            inline void SetF(const unsigned int uiM,const unsigned int uiN,const float f); 
    
            template <unsigned int uiCountN2> inline sgCMatrix<uiCountM,uiCountN2> operator*(const sgCMatrix<uiCountN,uiCountN2>& Matrix2); 
        //Massig andere Operatoren... 
    }; 	
    
    template<unsigned int uiCountM,unsigned int uiCountN>
    template<unsigned int uiCountN2> 
    inline sgCMatrix<uiCountM,uiCountN2> sgCMatrix<uiCountM,uiCountN>::operator*(const sgCMatrix<uiCountN,uiCountN2>& Matrix2) 
    { 
    	sgCMatrix<uiCountM,uiCountN2> MatrixReturn; 
    	for(int iLoopVariableFM=0;iLoopVariableFM<uiCountM;iLoopVariableFM++) 
    	{ 
    		for(int iLoopVariableFN=0;iLoopVariableFN<uiCountN2;iLoopVariableFN++) 
    		{ 
    			for(unsigned int uiLoopVar=0;uiLoopVar<uiCountN;uiLoopVar++) 
    			{ 
    				MatrixReturn.m_aaf[iLoopVariableFM][iLoopVariableFN]+= 
    					Matrix1.m_aaf[iLoopVariableFM][uiLoopVar] 
    				*Matrix2.m_aaf[uiLoopVar][iLoopVariableFN]; 
    			} 
    		} 
    	} 
    }
    

    Problem geloest?

    Gruss,
    DeSoVoDaMu

    EDIT: Visual C++ 2005 Beta 2 schluckt das, Visual C++ 6.0 dagegen nicht.



  • Kann ich in ner Template-Klasse eine Template funktion mit anderen Template-Parametern haben?

    Man kann in Template-Klassen Template-Funktionen definieren und diese können unterschiedliche Parameter besitzen.
    🙂



  • Naja, Problem gelöst, allerdings werd ich wohl auf DevCpp umstellen müssen! Ich kann mir Momentan keine neue Version von MS Visual kaufen.

    Danke für die schnelle überaschend hilfreiche Antwort!

    Samuel G.



  • Die Beta Version von Microsofts aktuellstem Visual Studio (Express Edt.) gibt es kostenlos (afair muss man sich dazu aber anmelden). In meinen Augen lohnt sich der Download alle mal, ich nutze sie fast ausschliesslich: http://lab.msdn.microsoft.com/express/visualc/

    Wenn du nur einen Compiler brauchst, kannst du dir auch kostenlos das VC 2003 Toolkit saugen (ohne Anmeldung): http://msdn.microsoft.com/visualc/vctoolkit2003/

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten