Forward Declaration



  • Hi Leute,

    ich habe seit einigen Wochen von Visual Studio 6.0 auf Visual Studio 8.0 umgestiegen. Und jetzt bin ich beim Portieren meiner Klassen. VS 6.0 und 8.0 haben zwei verschiedene Compiler, da die Fehlermeldung ganz unterschiedlich aussehen. Beim Portieren habe ich auf ein Problem gestossen. Der Compiler von VS 8.0 versteht keine Forward Declaration von VS 6.0, z.B.

    in der Datei matrix.h steht

    #include "vector.h"
    namespace imagingtools
    {
    template<typename _T> class MatrixNumerical : public Matrix<_T>
    {
    public :

    MatrixNumerical<_T> operator * ( const MathVector<_T> & r ) const
    {
    MatrixNumerical<_T> out;
    ....
    ....
    ....
    return out;
    }

    }; // class MatrixNumerical
    }; // namespace

    in der Datei "vector.h" steht

    namespace imagingtools
    {

    template <typename T> class MatrixNumerical;

    template <typename T> class MathVector : public std::vector<T>
    {

    imagingtools::MatrixNumerical<T> operator * (const
    imagingtools::MatrixNumerical<T> & r ) const
    {
    imagingtools::MatrixNumerical<T> out;
    ....
    ....
    ....
    return out;
    }

    }; // class MathVector
    }; // namespace

    Und im Operator * in vector.h kommt es zu einem Fehler wie
    error C2027: use of undefined type 'imagingtools::MatrixNumerical<T>' und einer Reihe von Folgefehlern. Wie kann das sein, in VC 6.0 hatte ich damit kein Problem.

    Vielleicht hat jemand dasselbe Problem gehabt und kann mir helfen.
    Danke.



  • Wenn ich das richtig sehe (und das kann man bei fehlenden CPP-Tags und Einrückung sehr schlecht lesen!) ist zum Zeitpunkt der Instantiierung von out nicht die gesamte Templatedeklaration sichtbar.



  • Lieber LordJaxom,

    es fehlen keine cpp-tags. Die Implementierung muss immer in einer Header-Datei sein, da man mit den Templates arbeitet. Der Fehler tritt schon im
    Procedure-Kopf auf:

    imagingtools::MatrixNumerical<T> operator * (
    const imagingtools::MatrixNumerical<T> & r ) const



  • @dynamo

    doch da fehlen cpp tags.

    beispiel für ein tag:

    Das ist ein code tag!!!!!!
    

    @LordJaxom

    #include "vector.h"
    namespace imagingtools
    {
    template<typename _T> class MatrixNumerical : public Matrix<_T>
    {
    public :
    
    MatrixNumerical<_T> operator * ( const MathVector<_T> & r ) const
    {
    MatrixNumerical<_T> out;
    ....
    ....
    ....
    return out;
    }
    
    }; // class MatrixNumerical
    }; // namespace
    
    in der Datei "vector.h" steht
    
    namespace imagingtools
    {
    
    template <typename T> class MatrixNumerical;
    
    template <typename T> class MathVector : public std::vector<T>
    {
    
    imagingtools::MatrixNumerical<T> operator * (const
    imagingtools::MatrixNumerical<T> & r ) const
    {
    imagingtools::MatrixNumerical<T> out;
    ....
    ....
    ....
    return out;
    }
    
    }; // class MathVector
    }; // namespace
    


  • Danke MartinMilbret für deine Bemerckung.



  • Einrückung fehlt immernoch und mein Statement bleibt bestehen: An der betroffenen Stelle ist die Template-Implementierung von out nicht verfügbar.



  • ok LordJaxom,

    out sieht beispielsweise so aus:

    imagingtools::MatrixNumerical<T> out( r.width(), 1, 0);



  • Die Forward-Deklaration reicht aus, wenn der Compiler sich mit dem Wissen begnügen kann, DASS ein entsprechender Typ existiert - für den operator* muß er jedoch auch wissen, WIE die Klasse aufgebaut ist.

    template <typename T> class MatrixNumerical;
    
    template <typename T> class MathVector : public std::vector<T>
    {
      //Deklaration - Forward-Angabe reicht
      MatrixNumerical<T> operator * (const MatrixNumerical<T> & r ) const;
    };
    
    template<typename _T> class MatrixNumerical : public Matrix<_T>
    {
    public :
      MatrixNumerical<_T> operator * ( const MathVector<_T> & r ) const
      {
        MatrixNumerical<_T> out;
        //....
        return out;
      }
    };
    
    //Definition - benötigt vollständige Typangabe
    template<typename T>
    MatrixNumerical<T> MathVector<T>::operator* (const MatrixNumerical<T> & r ) const
    {
      MatrixNumerical<T> out;
      //....
      return out;
    }
    


  • Hi CStoll (off),

    leider funktioniert dieser Ansatz nicht. Hier hat man mit einem kleinen Problemchen zu tun. Wo es aber ist, habe ich bis jetzt leider nicht festgestellt.



  • Wieso funktioniert der Ansatz denn nicht? (kleiner Tip: Du mußt deine Member nicht unbedingt in der Klassendeklaration definieren, sondern kannst das auch später erledigen, wenn alle benötigten Infos vorliegen)


Anmelden zum Antworten