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 :

Erreur de link avec surcharge operator


Sujet :

C++

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Erreur de link avec surcharge operator
    Bonjour

    Dans le but de réaliser une structure de matrice j'ai besoin de surcharger l'opérateur d'addition + afin de pouvoir additionner deux matrices. J'utilise aussi un template dont le paramètre T correspond au type des éléments de ma matrice.Tout le code suivant ce trouve dans le même fichier .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    template <typename T>
    struct Matrix
    {
       private :
          ...
       public   :
          ...
       friend Matrix<T> * operator + (Matrix<T> & matrix1, Matrix<T> & matrix2);
     
    };
     
     
    template <typename T>
    Matrix<T> * operator + (Matrix<T> & matrix1, Matrix<T> & matrix2)
    {
        .....
    }
    {
    et dans un autre fichier (main.cpp) j'ai la fonction main() et j'essaie d'additionner deux matrices :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Matrix<double> matrix1(3,4);
    Matrix<double> matrix2(3,4);
     
    Matrix<double> * matrix3 = matrix1 + matrix2;
    Mais j'obtiens l'erreur de link suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      [Linker Error] undefined reference to `operator+(Matrix<double>&, Matrix<double>&)'
    Quelqu'un aurait une idée d'où pourrait provenir cette erreur ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    template <typename T>
    struct Matrix
    {
       private :
          ...
       public   :
          ...
       friend Matrix<T> * operator + <>(Matrix<T> & matrix1, Matrix<T> & matrix2);
     
    };
     
     
    template <typename T>
    Matrix<T> * operator + (Matrix<T> & matrix1, Matrix<T> & matrix2)
    {
        .....
    }

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Merci mais j'obtiens maintenant une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    declaration of 'operator+' as non-function 
    et aussi
    expected `;' before '<' token
    à la ligne où se trouve l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend Matrix<T> * operator + <>(Matrix<T> & matrix1, Matrix<T> & matrix2);

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Il faut que ton operateur template soit déclaré avant la définition de la classe template Matrix.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    template <typename T>
    struct Matrix; //forward declaration
    
    template <typename T>
    Matrix<T> * operator + (Matrix<T> &, Matrix<T> &); //forward declaration
    
    template <typename T>
    struct Matrix
    {
       private :
          ...
       public   :
          ...
       friend Matrix<T> * operator + <>(Matrix<T> & matrix1, Matrix<T> & matrix2);
     
    };
     
     
    template <typename T>
    Matrix<T> * operator + (Matrix<T> & matrix1, Matrix<T> & matrix2)
    {
        .....
    }

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    32
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse, mais j'avais toujours une erreur de compilation.

    J'ai trouvé un moyen de compiler en ne déclarant pas l'operateur avec friend. J'utilise pour la surcharge d'opérateur une fonction inline.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    template <typename T>
    struct Matrix
    {
       private :
          ...
       public   :
          ... 
    };
     
     
    template <typename T>
    inline Matrix<T> * operator + (Matrix<T> & matrix1, Matrix<T> & matrix2)
    {
        .....
    }

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

Discussions similaires

  1. [CPPUNIT] Erreurs de link avec MSVC6.0
    Par vdaanen dans le forum Test
    Réponses: 1
    Dernier message: 04/11/2008, 12h22
  2. Erreur de link avec Gcc + QThread
    Par uriotcea dans le forum Débuter
    Réponses: 1
    Dernier message: 22/05/2008, 15h13
  3. [STL] Erreur au link avec VC++ et Pocket PC 2003
    Par Slayne dans le forum Mobiles
    Réponses: 2
    Dernier message: 24/08/2007, 11h45
  4. Erreur de link avec les templates
    Par suiss007 dans le forum C++
    Réponses: 6
    Dernier message: 04/01/2007, 11h09
  5. Erreurs de link avec fenêtres win32
    Par crossbowman dans le forum Windows
    Réponses: 4
    Dernier message: 21/02/2006, 01h08

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