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 :

Template et "undefined reference to operator<<"


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut Template et "undefined reference to operator<<"
    Bonjour,
    J'ai un classe point
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    template <unsigned D> class PointT { ...
    friend ostream &operator<<(ostream &oS, const PointT<D> &P);
    ... }
    et une surcharge d'op�rateur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    template <unsigned D>
    ostream &operator<<(ostream &oS, const PointT<D> &P)
    { ... }
    Dans mon main, j'ai
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
       PointT<4> P4({1.15,3.6,1.8});
      cout << P4;
    Et j'obtiens l'erreur suivant sur "cout << P4":
    undefined reference to `operator<<(std::ostream&, PointT<4u> const&)'

    J'avoue que je cale sur le probl�me ... auriez-vous une id�e ?
    En vous remerciant par avance.
    Christian

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Juste une petite question idiote : as-tu bien pens� � mettre le code du template dans l'header (.h) et non dans le fichier source (.cpp) ?

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    Oui - le fichier .h du template contient le header et le code (car c'est un bout de code de test que j'�crit). Le code de l'op�rateur surcharg� est avant mon main. En quoi cette s�paration influe-t-elle ?

  4. #4
    Membre exp�riment� Avatar de Vespiras
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2012
    Messages
    168
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 168
    Par d�faut
    Bonsoir, si tu veux dire que l'impl�mentation de ta surcharge d'op�rateur est dans ton main, tant que ton main connait le header ou est plac� le prototype, �a ne change rien. Apr�s, pour plus de clart� et une organisation "typique", il vaut mieux s�parer chaque .h et .cpp en fichiers distincts par classe.

    Pour ton probl�me, question toute b�te : As-tu mis dans le header de la classe point un :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include <iostream>
    using namespace std;
    ?

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par Vespiras Voir le message
    Bonsoir, si tu veux dire que l'impl�mentation de ta surcharge d'op�rateur est dans ton main, tant que ton main connait le header ou est plac� le prototype, �a ne change rien. Apr�s, pour plus de clart� et une organisation "typique", il vaut mieux s�parer chaque .h et .cpp en fichiers distincts par classe.
    On utilise ici une fonction template.
    Cf FAQ C++

    Citation Envoy� par Vespiras Voir le message
    Pour ton probl�me, question toute b�te : As-tu mis dans le header de la classe point un :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #include <iostream>
    using namespace std;
    ?
    En effet je pense qu'il l'a fait.
    Un autre lien de la FAQ s'impose.

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut Merci Laurent !
    Je suis finalement arriv� � la conclusion (apr�s quelques essais de fonctions friends sur des classes non templat�es) que la solution (ou le probl�me) se trouvait dans la d�claration de fonction friends dans les classes templat�es. Apr�s une recherche sur Google, je suis arriv� sur ce lien http://www.developpez.net/forums/d22...plates-friend/ qui m'a guid� vers la solution. En d�clarant la fonction comme ceci dans la classe template, �a marche:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    template <unsigned Q> friend ostream &operator<<(ostream &oS, const PointT<Q> &P);
    (i.e. il faut rajouter devant ).
    Encore merci � vous, Laurent et le site developpez qui est vraiment une mine !
    Christian

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Certes, mais c'est vraiment plus laxiste.
    Est-ce ce que tu souhaites ?

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    En quoi est-ce plus laxiste ? Par ailleurs, je n'ai pas trouv� d'autre solution ... Bien s�r, je suis preneur d'alternatives :-)

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Citation Envoy� par coberle Voir le message
    En quoi est-ce plus laxiste ? Par ailleurs, je n'ai pas trouv� d'autre solution ... Bien s�r, je suis preneur d'alternatives :-)
    Tu va autoriser toutes les m�thodes ostream &operator<<(ostream &oS, const PointT<Q> &P); � acc�der au contenu de ta classe au lieu d'autoriser uniquement l'unique m�thode utilis�e pour afficher ta classe.

    Pourrais-tu nous montrer le fichier d'en-t�te complet pour ta classe point ainsi que l'en-t�te contenant ton op�rateur << ?

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Citation Envoy� par coberle Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    template <unsigned D> class PointT { ...
    friend ostream &operator<<(ostream &oS, const PointT<D> &P);
    ... }
    Enl�ve ce que j'ai mis en gras.

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    En faisant comme tu le sugg�res, il y a 4 erreur qui sont g�n�r�es, comme par exemple :
    invalid use of template-name 'PointT' without an argument list;
    ISO C++ forbids declaration of 'P' with no type [-fpermissive]

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    Neckara - voici le code de la classe PointT et du main. Encore merci pour ton aide (j'utilise CodeBlocks avec compil gnu/gcc)

    Classe PointT (PointT.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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #ifndef POINTT_H_INCLUDED
    #define POINTT_H_INCLUDED
     
    #include <initializer_list>
     
    using namespace std;
     
    template <unsigned D> class PointT
    {
     public:
       PointT(initializer_list<float> coords);
       void Afficher();
     
       friend ostream &operator<<(ostream &oS, const PointT &P);
     
       static const unsigned dim;
     
     private:
        float m_coords[D]={0.0};
    };
     
    template <unsigned D>
    const unsigned PointT<D>::dim = D;
     
    template <unsigned D>
    PointT<D>::PointT(initializer_list<float> coords)
    {
        initializer_list<float>::iterator itr;
        int loop=min(D,coords.size());
        itr=coords.begin();
     
        for (int i=0; i<loop; i++)
            m_coords[i]=*itr++;
    }
     
    template <unsigned D>
    void PointT<D>::Afficher()
    {
       cout << "Dans afficher - " << this->m_coords[0] << endl;
    }
     
    #endif // POINTT_H_INCLUDED
    Main (main.cpp):
    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
    24
    25
    26
    27
    28
     
    #include <iostream>
    #include "PointT.h"
     
    using namespace std;
     
    template <unsigned D>
    ostream &operator<<(ostream &oS, const PointT<D> &P)
    {
        oS << "Point" << D << "D - (";
        for (int i=0; i<D-1; i++)
            oS << P.m_coords[i] << ",";
     
        oS << P.m_coords[D-1] << ")" << endl;
     
        return oS;
    }
     
    int main()
    {
        PointT<3> P({1.1,1.2,1.3});
     
        P.Afficher();
     
        cout << P; // ligne qui provoque l'erreur "undefined reference to "operator<< ..."
     
        return 0;
    }

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Pour r�gler ton probl�me de template :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    template 
    <unsigned D> class PointT;
     
    template<unsigned D>
    ostream &operator<<(ostream &oS, const PointT<D> &P);
     
    //dans ta classe
    friend ostream &operator<<<>(ostream &oS, const PointT<D> &P);
    Attention, jamais de using namespace dans un header.

    Je continue de regarder les autres erreurs.

    EDIT : Dans ton constructeur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    int loop=min(D, (unsigned)coords.size());
    R�sultat d'ex�cution :
    ~$ ./exe
    Dans afficher - 1.1
    Point3D - (1.1,1.2,1.3)
    Est-ce bien le r�sultat attendu ?

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    Merci Neckara ... �a fonctionne.
    Mais je ne suis pas certain de bien comprendre le pourquoi du comment:
    - pourquoi ceci avant la classe
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template 
    <unsigned D> class PointT;
     
    template<unsigned D>
    ostream &operator<<(ostream &oS, const PointT<D> &P);
    - pourquoi ensuite PS - je crois qu'il y a une r�ponse ici http://stackoverflow.com/questions/4...lass-templates

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Citation Envoy� par coberle Voir le message
    Merci Neckara ... �a fonctionne.
    Mais je ne suis pas certain de bien comprendre le pourquoi du comment:
    - pourquoi ceci avant la classe
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template 
    <unsigned D> class PointT;
     
    template<unsigned D>
    ostream &operator<<(ostream &oS, const PointT<D> &P);
    C'est le principe des d�clarations anticip�es.

    Citation Envoy� par coberle Voir le message
    - pourquoi ensuite PS - je crois qu'il y a une r�ponse ici http://stackoverflow.com/questions/4...lass-templates
    En fait tu dis que ta classe est friend avec une sp�cialisation de ta m�thode template.
    Si j'ai mis les <> c'est surtout parce que le warning me demandait de les mettre.
    Mais d'apr�s ton lien, c'est juste pour informer que la fonction est template.


    Sinon ton code est correct si tu souhaites que seul main.cpp puisse utiliser la fonction template sinon, cf FAQ.

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Par d�faut
    Merci beaucoup, c'est vraiment sympa.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 8
    Dernier message: 20/03/2011, 02h21
  2. System - Event / Template => undefined reference
    Par Whyzix dans le forum Langage
    R�ponses: 8
    Dernier message: 06/04/2010, 23h18
  3. " undefined reference to " avec methode template
    Par coldrink dans le forum Langage
    R�ponses: 3
    Dernier message: 24/10/2009, 20h05
  4. R�ponses: 6
    Dernier message: 18/03/2009, 12h27
  5. [Template] Templates et undefined reference
    Par FadeOut dans le forum C++
    R�ponses: 9
    Dernier message: 12/12/2008, 17h04

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