Problem mit typedef und Vererbung



  • Hallo Gemeinde,

    ich habe ein Problem mit einem typedef und dessen Vererbung. Der Compiler haut mir eine menge Fehler raus, die ich aber nicht beheben kann. Hier erstmal der Code:

    IMatrix.h

    #ifndef IMATRIX_H_
    #define IMATRIX_H_
    
    template<class T>
    class IMatrix
    {
    public:
    	typedef unsigned int size_type;
    
    	virtual size_type breite()=0;
    	virtual size_type hoehe()=0;
    
    	IMatrix<T>& operator=(IMatrix<T>& m)
    	{
    		if (this != &m) {
    			dimensionieren(m.breite(), m.hoehe());
    
    			for (IMatrix<T>::size_type y=0; y<m.hoehe(); ++y) { // ERROR!
    				for (IMatrix<T>::size_type x=0; x<m.breite(); ++x) { // ERROR
    					/* some actions */
    				}
    			}
    		}
    
    		return *this;
    	}
    };
    
    #endif /*IMATRIX_H_*/
    

    Der Compiler meldet hier 2 Fehler in Zeile 18 + 19:

    IMatrix.h: In member function ‘IMatrix<T>& IMatrix<T>::operator=(IMatrix<T>&)’:
    IMatrix.h:18: error: expected ;' before ‘y’ IMatrix.h:18: error: ‘y’ was not declared in this scope IMatrix.h:19: error: expected;' before ‘x’
    IMatrix.h:19: error: ‘x’ was not declared in this scope

    Was ist daran falsch? Ich gehe über den namespace von IMatrix<T> und wähle den typ aus, dieser entspricht unsigned int was ja für for schleifen zulässig ist. Kann mir das jemand erklären, warum das nicht funktioniert?

    Als nächstes habe ich in dem Zusammenhang ein Problem mit der Vererbung:

    Matrix.h

    #ifndef MATRIX_H_
    #define MATRIX_H_
    
    #include "IMatrix.h"
    
    template<class T>
    class Matrix : public IMatrix<T>
    {
    private:
    	size_type m_breite; // ERROR!
    	size_type m_hoehe;  // ERROR!
    };
    
    #endif /*MATRIX_H_*/
    

    Matrix.h:10: error: ‘size_type’ does not name a type
    Matrix.h:10: note: (perhaps ‘typename IMatrix<T>::size_type’ was intended)
    Matrix.h:11: error: ‘size_type’ does not name a type
    Matrix.h:11: note: (perhaps ‘typename IMatrix<T>::size_type’ was intended)

    Das verstehe ich auch nicht so richtig, Matrix erbt von IMatrix und es werden somit auch die Typen vererbt. Der

    typedef unsigned int size_type
    

    ist in IMatrix unter publc definiert, somit müsste er doch von der Vererbungs.Logik auch problemlos unter Matrix verfügbar sein, oder Irre ich mich da jetzt komplett?

    Ich hoffe es kann jemand licht ins dunkle bringen.

    Vielen Danke,

    so long
    jd



  • Bei komplexeren Typen, die von Templateparametern abhängig sind, musst du noch ein typename vorne dran stellen.

    typename IMatrix<T>::size_type
    

    Wenn du die Methoden aber eh inline definierst, musst du die Klassenzugehörigkeit nicht explizit angeben.



  • Was hast du den für einen Compiler?
    Kann durchaus sein, dass du einen etwas älteren hast, der templates halt nicht so unterstützt, wie er sollte. 😉



  • Hi, danke schonmal für die Hilfe, somit ist das Problem gelöst. Mache ich da was mit der Vererbung falsch, was typedef angeht?

    typename IMatrix<T>::size_type m_breite;
    

    funktioniert in Matrix.h, aber ich verstehe das nicht.

    Der typedef ist doch nix anderes als ein unsigned int ... also warum kann ich in der Abgeleiteten klasse nicht einfach size_type verwenden?

    so long
    jd



  • drakon schrieb:

    Was hast du den für einen Compiler?
    Kann durchaus sein, dass du einen etwas älteren hast, der templates halt nicht so unterstützt, wie er sollte. 😉

    Das habe ich auch gedacht, das es der Compiler ist, oder ne doofe einstellung, aber ich verwende einen sehr neuen: gcc-4.3 - Debian-Lenny



  • Weil du dem Compiler sagen musst, dass size_type ein Typ ist und nichts anderes, was auch möglich wäre. VC++ z.B kann es zwar erkennen, ist aber nicht Standardverhalten.

    Kannst ja mal hier lesen:
    http://www-home.fh-konstanz.de/~bittel/aldaBac/Praktikum/typename.htm



  • Ok, also wenn ich das jetzt richtig verstehe muss ich in jeder Abgeleiteten Klasse:

    typedef typename IMatrix<T>::size_type size_type;
    

    schreiben, um size_type verwenden zu können, oder gibts da noch etwas kürzeres um das zu realisieren?



  • Das ist die übliche Vorgehensweise.

    Du kannst natürlich auch noch vorher ein anderes typedef haben:

    typedef IMatrix<T> my_type;
    typedef typename my_type::size_type size_type;
    

    Ist schlussendlich aber dasselbe..



  • Ok, danke für eure Hilfe, nun sind alle Fragen geklärt 👍


Log in to reply