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

Langage C++ Discussion :

Surcharge de << avec une class Template ?


Sujet :

Langage C++

  1. #1
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut Surcharge de << avec une class Template ?
    Bonjour,

    j'ai un petit probleme de surcharge de l'operateur <<

    voila donc j'aimerais pouvoir afficher une matrix dans la console (max 10x10)

    le 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
     
    #include <iostream> 
    #include "MptMatrix.hpp"
     
    using namespace std;
     
    main () {
    ...
    MptMatrix<uint32> meanMx(height+1,width+1);
    meanMx.loadPad2DImage(bw_img);
    cout << meanMx << endl;
    ...
    }
    ....
    et voici le code de MptMatrix.hpp

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #ifndef MptMATRIX_H
    #define MptMATRIX_H
     
    #include <c4v.h>
    #include <iostream>
    template <class T>
    class MptMatrix {
     
    public:
    	// Default Constructor	
    	MptMatrix(void);
     
    	// Constructor by Copy
    	MptMatrix(const MptMatrix& initMx);
     
    	// Constructor
    	MptMatrix(int r, int c, bool scanHori=true);
     
    	// Destructor
    	~MptMatrix();	
     
    	// Get function 
    	inline int getRows();
    	inline int getCols();
    	inline bool scanHorizontal();
    	inline int getScan1Size();
    	inline int getScan2Size();
     
    	void create(int r, int c, bool scanHori=true);
    	void loadImage(IplImage * img);
    	void loadPad2DImage(IplImage* img);
     
    	//Surcharge function
    	friend std::ostream& operator<<(std::ostream&, MptMatrix<T>&);
     
     
    private:
    	T *_pdata;
    	int _rows, _cols;
    	bool _scanHori;
     
    };
     
     
    template <class T>
    inline int MptMatrix<T>::getRows() { return _rows; } 
     
    template <class T>
    inline int MptMatrix<T>::getCols() { return _cols; }
     
    template <class T>
    inline bool MptMatrix<T>::scanHorizontal() { return _scanHori; }
     
    template <class T>
    inline int MptMatrix<T>::getScan1Size() { return (_scanHori)? _cols : _rows;} 
     
    template <class T>
    inline int MptMatrix<T>::getScan2Size() { return (_scanHori)? _rows : _cols;}
     
    template <class T>
    std::ostream& operator<<(std::ostream& os, MptMatrix<T>& mX)
    {
    	int tmp;
    	os << "Matrix (w x h) :" << mX._rows<< " x " << mX._cols;
     	if(!mX._scanHori) os << "VERTICAL SCAN" << std::endl;
    	for(int i(0); i<10;i++) {
    		tmp = i*mX.getScan1Size();
    		for(int j(0);j<10;j++) {
    			os << mX._pdata[tmp+j] << " ";
    		}
    		os << std::endl;
    	}
    	os  << std::endl;
      return os;
    }
     
    #include "MptMatrix.cpp"
    #endif
    Et l'erreur de compilation c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    neub@hpdv1000:~/projetDS/openCV$ make
    g++  -Iinclude `pkg-config opencv --cflags` -g -D_DEBUG  -c src/main.cpp -o obj/main.o
    src/MptMatrix.hpp:34: attention : friend declaration «std::ostream& operator<<(std::ostream&, MptMatrix<T>&)» declares a non-template function
    src/MptMatrix.hpp:34: attention : (si ce n'est pas ce que vous vouliez faire, soyez sûr que le patron de la fonction a déjà été déclaré et ajouter <> après le nom de la fonction ici) -Wno-non-template-friend désactive le présent avertissement
    obj/main.o : Dans la fonction "imageProcess(char const*)":src/main.cpp:59: référence indéfinie vers « operator<<(std::basic_ostream<char, std::char_traits<char> >&, MptMatrix<unsigned int>&)»
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [trackpatch] Erreur 1

    Alors voila j'ai 2 questions :

    1. Pourquoi je n'ai pas besoin du template. Je sais que ce n'est pas une classe appartenant a MptMatrix mais je doit quand meme lui dire de quel type c'est...

      template <class T>
      std::ostream& operator<<(std::ostream& os, MptMatrix<T>& mX)

      Pourquoi ca marche mieux si il n'y a pas la template, pourtant MptMatrix<T>& mX a bien un T.

      La je ne comprend pas bien et pas reussis a trouver qqc qui explique ca dans la faq!

    2. Pourquoi j'ai ma 2eme erreur
      Dans la fonction "imageProcess(char const*)":src/main.cpp:59: référence indéfinie vers « operator<<(std::basic_ostream<char, std::char_traits<char> >&, MptMatrix<unsigned int>&)»
      collect2: ld a retourné 1 code d'état d'exécution



    Voila merci d'avance pour votre aide precieuse

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Je suis pris d'un doute concernant la première question, et je vais donc laisser ceux qui sont sûrs d'eux y répondre...

    Par contre, pour ce qui concerne la deuxieme erreur, elle découle directement de la première:

    Comme le compilateur n'a pas su (du fait de la première erreur) créer la surcharge de l'opérateur, mais qu'il dispose de la déclaration de la surcharge, et qu'en plus, la surcharge est utilisée ailleurs, l'éditeur de lien trouve tout ce qui concerne la surcharge de l'opérateur... sauf le principal: une adresse vers laquelle faire pointer l'appel de la fonction...

    S'il fallait donner la parole à l'éditeur de liens, sa réaction serait fort semblable à
    C'est tres bien, tu me dis que la fonciton existe, tu me dis qu'il faut l'utiliser, mais tu ne me dis pas où je peux la trouver... Alors, je fais comment, moi
    Bref, tout cela pour dire que, dés que tu auras résolu le premier problème, et que la définition de la surcharge de l'opérateur sera correctement écrite, la deuxième erreur s'évaporera presque comme "par magie"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Voir ce post et la discussion qui va avec.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ta déclaration d'ami ne va pas.
    Tu déclares une fonction en amie, pas l'instanciation d'un template de fonction.
    Boost ftw

  5. #5
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Rebonjour,

    alors j'ai lu le post et essayé de comprendre mais je crois qu'il me manque des notions !!!

    j'ai fait divers test en changeant mon MptMatrix.hpp mais ca ne compile toujours pas.

    PS:j'ai mis la déclaration de la fonction avant la classe pour tous mes test.

    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
     
     
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX){
      ...
      return os;
    }
     
    template <class T>
    class MptMatrix {
     
    public:
     
    	friend std::ostream& operator<<<>(std::ostream&,const MptMatrix&);
     
    ou sinon 
            friend std::ostream& operator<<<T>(std::ostream&, const MptMatrix&);
    }
    ca ne marche pas

    j'ai essayer avec deux templates differents ca ne marche pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX){
      ...
      return os;
    }
     
    template <class T>
    class MptMatrix {
     
    public:
     
            template <class U>
    	friend std::ostream& operator<<(std::ostream&,const MptMatrix<U>&);
    }

    Si vous pouviez me donner un exemple plus concret car dans le post les exemples sont fait sur des structure et pas avec l'operateur <<

    Merci encore

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si vous pouviez me donner un exemple plus concret car dans le post les exemples sont fait sur des structure et pas avec l'operateur <<
    Ca ne change rien, la situation est strictement identique.

    Ce que tu oublies (et qui est bien présent dans l'autre discussion) c'est la déclaration de la classe MptMatrix avant celle de l'opérateur <<. D'ailleurs il faudra pour ce dernier que tu sépares déclaration et définition.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Bon alors j'ai modifier un peu le code pour mettre les definitions avant mais ca compile toujours pas ...

    Je suis désolez mais j'arrive pas a comprendre pourquoi ca marche pas

    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
     
     
    #ifndef MptMATRIX_H
    #define MptMATRIX_H
    #include <iostream>
     
     
    /* Definitions */
    template <class T> class MptMatrix;
     
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX);
     
    /* Declarations */
    template <class T>
    class MptMatrix {
     
    public:
     
    ...
    	friend std::ostream& operator<<<T>(std::ostream&, MptMatrix&);
     
     
    private:
    	int _rows, _cols;
    };
     
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX)
    {
    	os << "Matrix (w x h) :" << mX._rows<< " x " << mX._cols;
            return os;
    }
    La seule chose que j'ai changer par rapport a http://www.developpez.net/forums/sho...34#post1389034
    c'est le template <typename T> en template <class T> du que j'ai une classe et non une structure ...

    J'espere que j'ai bien fait ....


    et voici l'erreur de compilation!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    src/MptMatrix.hpp: In instantiation of «MptMatrix<unsigned int>»:
    src/main.cpp:58:   instantiated from here
    src/MptMatrix.hpp:41: erreur: template-id «operator<< <unsigned intfor «std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, MptMatrix<unsigned int>&)» does not match any template declaration
    src/MptMatrix.hpp: In function «std::ostream& operator<<(std::ostream&, const MptMatrix<T>&) [with T = unsigned int]»:
    src/main.cpp:60:   instantiated from here
    src/MptMatrix.hpp:46: erreur: «int MptMatrix<unsigned int>::_cols» is private
    src/MptMatrix.hpp:72: erreur: à l'intérieur du contexte
    mais j'arrive pas a comprendre l'erreur à la ligne 41.

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tes déclarations sont inconsistantes à cause de const manquant.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    P'tin ca fait ***** car c'etait vraiment trop bete ce const !!!!

    Bon sinon a part ca il me reste un petit probleme... mais tres incomprehensible

    j'arrive pas a appeler une fonction de la classe dans ma methode friends.

    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
     
    #ifndef MptMATRIX_H
    #define MptMATRIX_H
    #include <iostream>
     
    /* Definitions */
    template <class T> class MptMatrix;
     
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX);
     
    /* Declarations */
    template <class T>
    class MptMatrix {
     
    public:
     
    ...
            inline int getScan1Size();
    	friend std::ostream& operator<<<T>(std::ostream&, const MptMatrix&);
     
     
    private:
    	int _rows, _cols;
            bool _scanHori;
    };
     
    template <class T>
    inline int MptMatrix<T>::getScan1Size() { return (_scanHori)? _cols : _rows;} 
     
    template <class T>
    std::ostream& operator<<(std::ostream& os,const MptMatrix<T>& mX)
    {
            int nof_step(0);
            nof_step = mX.getScan1Size();
    	os << "Matrix (w x h) :" << mX._rows<< " x " << mX._cols << std::endl;
            os << "nof step:" << nof_step << std::endl;
            return os;
    }
    Et voila l'erreur de compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    src/MptMatrix.hpp: In function «std::ostream& operator<<(std::ostream&, const MptMatrix<T>&) [with T = unsigned int]»:
    src/main.cpp:60:   instantiated from here
    src/MptMatrix.hpp:74: erreur: passing «const MptMatrix<unsigned int>» as «this» argument of «int MptMatrix<T>::getScan1Size() [with T = unsigned int]» discards qualifiers
    make: *** [obj/main.o] Erreur
    Merci encore pour tous le reste ...
    vous m'avez bien appris !!!

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Toujours un problème de const apparamment (getScan1Size doit être const).

    c'est le template <typename T> en template <class T> du que j'ai une classe et non une structure ...
    Classe et structure c'est la même chose, tout comme "typename" et "class" en paramètre template.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    getScan1Size n'est pas un membre const et tu l'appelles pour un objet const.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2011, 14h34
  2. Surcharge d'opérateur dans une classe template
    Par Opérateur dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2008, 03h26
  3. template et utilisation avec une classe existante
    Par vartav dans le forum Langage
    Réponses: 6
    Dernier message: 14/03/2007, 10h39
  4. Probleme avec une class template
    Par lenectar dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2006, 10h49
  5. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

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