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 :

Opérateur template ?


Sujet :

Langage C++

  1. #1
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut Opérateur template ?
    Bonjour,
    Je tente de créer un objet qui contient un wostringstream et qui intercepte de fonctionnement de l'opérateur << :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    /*
    Classe CDebugWithIndent:
    	Cette classe sert à déboguer.
    */
    #ifndef CDEBUGWITHINDENT_HPP_INCLUS
    #define CDEBUGWITHINDENT_HPP_INCLUS
     
    #include <iostream>
    #include <string>
    #include <sstream>
     
    namespace NsFredUtil
    {
     
    class CDebugWithIndent
    {
    //////////////////////////////// L'opérateur est déclaré ici ///////////////////
    //--- Fonctions amies ---
    	template< class T >
    	friend CDebugWithIndent & operator <<(
    	 CDebugWithIndent &rDwi,	//[in] Objet CDebugWithIndent dans lequel écrire
    	 T const &rcDonnee	//[in] Donnée à écrire
    	 );
     
    //--- Variables de classe ---
    private:
    //--- Variables d'instance ---
    protected:
    	size_t m_nIndent;
    	std::wostringstream m_ossW;
     
    //--- Constructeurs et destructeur ---
    protected:
    	//Constructeur
    	//[inline]
    	CDebugWithIndent(
    	 void
    	 ) : m_nIndent(0)
    		{
    		//Rien.
    		}
    	//Destructeur virtuel
    	//[inline]
    	virtual ~CDebugWithIndent(void)
    		{
    		//Rien.
    		}
     
    //--- Méthodes de classe ---
    public:
    //--- Méthodes d'instance ---
    protected:
    	//Réaction à l'opération d'insertion de flux
    	//[virtuelle]
    	virtual void v_InsertionFlux(void);
     
    //--- Opérateurs ---
    public:
    	//Opérateur pour incrémenter le niveau d'indentation (préfixe)
    	//[non-virtuelle + NULL-safe]
    	//[inline]
    	CDebugWithIndent & operator ++ (void)
    		{
    		if(this != NULL)
    			m_nIndent++;
    		return *this;
    		}
    	//Opérateur pour incrémenter le niveau d'indentation (postfixe)
    	//[non-virtuelle + NULL-safe]
    	//[inline]
    	void operator ++ (int)
    		{
    		if(this != NULL)
    			m_nIndent++;
    		}
    	//Opérateur pour décrémenter le niveau d'indentation (préfixe)
    	//[non-virtuelle + NULL-safe]
    	//[inline]
    	CDebugWithIndent & operator -- (void)
    		{
    		if(this != NULL && m_nIndent > 0)
    			m_nIndent--;
    		return *this;
    		}
    	//Opérateur pour décrémenter le niveau d'indentation (postfixe)
    	//[non-virtuelle + NULL-safe]
    	//[inline]
    	void operator -- (int)
    		{
    		if(this != NULL && m_nIndent > 0)
    			m_nIndent--;
    		}
    };
     
     
    //--- Fonctions templates ---
     
    /* Opérateur d'insertion de flux
       ----------------------------- */
    template< class T >
    NsFredUtil::CDebugWithIndent & operator <<(
     NsFredUtil::CDebugWithIndent &rDwi,	//[in] Objet CDebugWithIndent dans lequel écrire
     T const &rcDonnee	//[in] Donnée à écrire
     )
    {
    if(this != NULL)
    	{
    	m_ossW << rcDonnee;
    	v_InsertionFlux();
    	}
    return *this;
    }
     
    }//namespace NsFredUtil
     
    #endif// ! CDEBUGWITHINDENT_HPP_INCLUS
    Malheureusement, aucun de mes fichiers utilisateur ne voit l'opérateur!
    Et ce, qu'il soit défini dans la classe ou en friend.

    Les opérateurs template seraient-ils interdits? Pourtant, quand le compilo examine la classe elle-même, je n'ai aucune erreur, aucun avertissement, et pourtant je suis en Warning level 4 (le maximum sur Visual 2005)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Par défaut
    une question comme ça:

    Pq inclues-tu ton operateur template dans ta classe lors de son implémentation?

    template< class T >
    NsFredUtil::CDebugWithIndent & operator <<(
    NsFredUtil::CDebugWithIndent &rDwi, //[in] Objet CDebugWithIndent dans lequel écrire
    T const &rcDonnee //[in] Donnée à écrire
    )

    De 2 choses l'une, ou tu ne l'inclue pas dans ta classe (tu retire alors le NsFredUtil:, ou tu le mets dedans mais alors tu ne doit plus le déclarer comme fonction amie dans ta classe.

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 294
    Par défaut
    Pourquoi un ami ? C'est une fonction membre de ta classe a priori.
    De plus, tu définis ton opérateur dans un espace de noms.

    Eventuellement, jettes un oeil à la FAQ de fclc++ à propos de la définition de de flux.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    NsFredUtil est le namespace contenant mes classes.
    (Entre autre, il contient la classe CDebugWithIndent, c'est pourquoi l'opérateur retourne une référence vers un objet de type NsFredUtil::CDebugWithIndent)

    Pour l'opérateur, j'ai essayé en fonction membre puis en fonction globale, aucun des deux ne marchait...

    Le message d'erreur obtenu est le suivant:
    Citation Envoyé par VS 2005
    >z:\...\ccompareguid.hpp(35) : error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'NsFredUtil::CDebugWithIndent' (or there is no acceptable conversion)
    1> z:\...\chainesetguids.h( 68 ): could be 'std::wostream &NsRegReader::operator <<(std::wostream &,const GUID &)'
    1> z:\...\cemplacementguid.hpp( 130 ): or 'std::wostream &NsRegReader::operator <<(std::wostream &,const NsRegReader::CEmplacementGuid &)'
    1> z:\...\clisteemplacementsguid.hpp( 91 ): or 'std::wostream &NsRegReader::operator <<(std::wostream &,const NsRegReader::CListeEmplacementsGuid &)'
    1> while trying to match the argument list '(NsFredUtil::CDebugWithIndent, overloaded-function)'
    Je n'arrive pas à comprendre, parce que les autres opérateurs sont trouvés (ceux avec wostream) et pour celui-ci, il ne trouve rien, alors qu'il le connait forcément puisqu'il connait la classe qui est dans le même namespace...


    Est-ce parce que mon opérateur est une fonction template? Pourtant, il ne me met pas d'erreur lors de la déclaration/définition, seulement lorsque je cherche à l'utiliser...

    Et oui, je suis passé par la FAQ C++, il y a des templates, des opérateurs, des opérateurs membres de fonction template, mais rien sur les opérateurs templates... (Edit: ah oui, la FAQ fr.com.lang.c++... je jette un coup d'oeil)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut Re: Opérateur template ?
    Citation Envoyé par Médinoc
    et pourtant je suis en Warning level 4 (le maximum sur Visual 2005)...
    hum c'est pas tout à fait vrai, il est possible de mettre des avertissements supplémentaires en ajoutant /wall dans la ligne de commande...
    Mais attention car il y aura même des avertissements dans la bibliothèque standard...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Hum... Il y a sûrement un problème: J'ai l'impression qu'il a ignoré mon opérateur template, parce qu'il n'a même pas gueulé qu'il utilisait this alors qu'il n'était plus dans la classe...

    Par contre, même en corrigant le this, il semble toujours l'ignorer... Et faire toujours la même erreur...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On dirait bien que j'ai trouvé: C'étaient les manipulateurs de flux qui ne rentraient pas dans le template, plus le fait que le template se trouve dans un namespace.

    Il ne me reste plus qu'à régler proprement le cas de std::endl qui est surchargé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [mingw] - Surcharge opérateur template
    Par buzzkaido dans le forum C++
    Réponses: 1
    Dernier message: 26/06/2009, 11h27
  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. Opérateur template "undefined"
    Par Ch@hine dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2008, 18h19
  4. Opérateur new[] et template
    Par progfou dans le forum Langage
    Réponses: 29
    Dernier message: 08/03/2007, 11h31
  5. Réponses: 13
    Dernier message: 29/09/2006, 16h10

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