IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Un problème à la compilation


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Par défaut Un problème à la compilation
    Bonjour,

    Je travaille actuellement sur un programme en C++ qui permet différentes opérations sur les matrices : saisie à partir d'un clavier, d'un fichier, multiplication.
    Les éléments des matrices sont rangés dans des vecteurs. Ensuite, ils sont remis dans l'ordre correct pour afficher la matrice.
    Donc j'ai deux classes : Vector et Matrix (pas d'héritage, je me le suis imposé).
    Donc tout d'abord, j'avais testé mon programme sans l'ajout de templates et il marchait trés bien mais maintenant que j'ai ajouté des templates en gros Vector est devenu Vector<T> et Matrix ->Matrix<T>, j'ai les erreurs suivantes à l'édition de liens (la compilation est OK):

    ------ Build started: Project: Part_2, Configuration: Debug Win32 ------
    Compiling...
    main.cpp
    Linking...
    main.obj : error LNK2019: unresolved external symbol "class std::basic_ofstream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ofstream<char,struct std::char_traits<char> > &,class Matrix<double> &)" (??6@YAAAV?$basic_ofstream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matrix@N@@@Z) referenced in function _main
    main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Matrix<double> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matrix@N@@@Z) referenced in function _main
    main.obj : error LNK2019: unresolved external symbol "class Matrix<double> __cdecl operator*(class Matrix<double> const &,class Matrix<double> const &)" (??D@YA?AV?$Matrix@N@@ABV0@0@Z) referenced in function _main
    main.obj : error LNK2019: unresolved external symbol "class std::basic_ifstream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_ifstream<char,struct std::char_traits<char> > &,class Matrix<double> &)" (??5@YAAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matrix@N@@@Z) referenced in function _main
    main.obj : error LNK2019: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class Matrix<double> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Matrix@N@@@Z) referenced in function _main
    C:\Documents and Settings\Invité\Bureau\C++_Assignment\Part_2\D\Debug\Part_2.exe : fatal error LNK1120: 5 unresolved externals
    Build log was saved at "file://c:\Documents and Settings\Invité\Bureau\C++_Assignment\Part_2\D\Part_2\Debug\BuildLog.htm"
    Part_2 - 6 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

    Apparemment, cela se passe avec mes méthodes "friend" de la classe Matrix, je ne sais pas si c'est lié...

    Merci d'avance à ceux qui pourront éclairer ma lanterne

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Dio,

    C'est la bonne période pour ressortir les boules de cristal.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    C'est la redéfinition des opérateurs << et >> qui pose problème depuis que tu as templatisé tes classes, car tu as dû déclarer ces opérateurs en tant que fonctions non-membres amies de tes classes, mais tu as oublié de les rendre template ou tu as mal fait cette opération.

    Poste éventuellement un bout de code qu'on puisse voir ce qui cloche, ça ira mieux pour qu'on comprenne!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Par défaut
    template<class T>
    class Matrix {

    private:
    Vector<T> v; // Vector used to store the matrix elements
    int nrows; // number of rows of the matrix
    int ncols; // number of columns of the matrix

    public:
    Matrix(); // default constructor, uses default constructor for v
    Matrix(int Nrows, int Ncols); // alternate constructor
    T& operator() (int i, int j) const; // function call overload (-,-)
    friend Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2); // overload * for matrix multiplication
    friend std::istream& operator>>(std::istream& is, Matrix<T>& m);// keyboard input
    friend std::ostream& operator<<(std::ostream& os, Matrix<T>& m);// screen output
    friend std::ifstream& operator>>(std::ifstream& ifs, Matrix<T>& m);// file input
    friend std::ofstream& operator<<(std::ofstream& ofs, Matrix<T>& m);// file output

    };

    Voici les fonctions membres qui semblent clocher (j'ai effacé les instructions à l'intérieur).

    template<class T>
    Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2){

    ..........................

    }

    template<class T>
    std::istream& operator>>(std::istream& is, Matrix<T>& m) {
    ...................
    }


    template<class T>
    std::ostream& operator<<(std::ostream& os, Matrix<T>& m) {

    }


    template<class T>
    std::ifstream& operator>>(std::ifstream& ifs, Matrix<T>& m) {
    ...........
    }

    template<class T>
    std::ofstream& operator<<(std::ofstream& ofs, Matrix<T>& m) {
    ...........
    }

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    Déjà, pense à la balise code quand tu postes du code...

    Donc c'est bien ce que je pensais: la définition de tes opérateurs est sous forme de templates, mais pas la déclaration dans ta classe. Consulte http://www.developpez.net/forums/sho...d.php?t=455890 pour avoir une idée de la solution.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13
    Par défaut
    merci pour ta réponse.

    Ca a réglé mon problème de compilation en mettant template<class T> devant les membres amis dans la classe Matrix.
    Cependant, j'ai une dernière question quelle est la différence entre template<class T> et template<typename T> ?
    Est ce que devant les membre amis je dois mettre template<typename T> justement? ou c'est quand j'instance par exemple pour faire Matrix <double> m1 dans le main je dois faire template<typename T> partout?

    Merci d'avance

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    quelle est la différence entre template<class T> et template<typename T> ?
    Dans une déclaration de template, les mots clés class et typename sont synonymes et interchangeables. (Attention cependant, typename a d'autres utilisations exclusives.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  2. problème de compil devc++ socket
    Par stefdem dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2003, 11h33
  3. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo