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 :

Méthode template dans classe non template ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 568
    Par défaut Méthode template dans classe non template ?
    Bonjour,

    je me suis créé une classe pour gérer de manière souple des messages d'exception :
    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
    // exception de base
    class exception_base : public std::exception
    {
    public: // methodes publiques
    	exception_base(void);
    	exception_base(exception_base& e);
    	virtual ~exception_base(void);
    
    
    	// operateurs de flux
    	exception_base& operator<<(const char* s);
    	exception_base& operator<<(const int& v);
    	exception_base& operator<<(const unsigned int& v);
    
    	// recuperation du message d'erreur
    	std::string Message(void);
    
    
    protected: // donnees protegees
    	std::ostringstream			m_sMessage;
    };
    vous remarquerez en gras les opérateurs de flux pour envoyer un int et un unsigned int dans le flux

    j'aimerai savoir s'il y a un moyen de templater l'opérateur ou si je vais devoir (re)définir tous les opérateurs qui me sont nécessaires

    en passant, si vous avez des commentaires/critiques sur cette classe n'hésitez pas à m'en faire part
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Oui, tu peux sans problèmes définir des membres templates dans une classe non template, à condition que les membres ne soient pas virtuels.

    Mais la méthode habituelle pour optenir les opérateurs d'insertion, c'est d'hériter de ostream en ayant défini son propre streambuf. Il y a un exemple dans la FAQ de fclc++.

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 568
    Par défaut
    merci pour le lien, je vais aller y jeter un oeil

    de mon côté j'ai ajouté la méthode suivante à ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<class T>exception_base& operator <<(const T& something)
    {
    	m_sMessage << something;
    	return *this;
    }
    est-ce une bonne solution ?

    en tout cas ça fonctionne , à condition que je déclare toute la méthode dans le .h
    je ne comprend pas pourquoi je ne peux prototyper la méthode dans le .h et la déclarer dans le .cpp sans avoir d'erreurs de liens non résolus
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par shenron666
    je ne comprend pas pourquoi je ne peux prototyper la méthode dans le .h et la déclarer dans le .cpp sans avoir d'erreurs de liens non résolus
    http://c.developpez.com/faq/cpp/?pag...VERS_templates

  5. #5
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    en tout cas ça fonctionne
    Tu ne pourras pas injecter de manipulateurs (std::endl par exemple).

  6. #6
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 568
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Mais la méthode habituelle pour optenir les opérateurs d'insertion, c'est d'hériter de ostream en ayant défini son propre streambuf. Il y a un exemple dans la FAQ de fclc++.
    je n'ai rien trouvé sur fclc++ me permettant d'aboutir et en même temps je voudrais éviter d'hériter de ostream
    mais si tu as un exemple je prend, parcequ'il semble impossible de lever une exception basée sur ostream

    Citation Envoyé par Laurent Gomila
    Tu ne pourras pas injecter de manipulateurs (std::endl par exemple).
    même si c'est plutot secondaire pour une simple classe exception, tu pourrais m'aider que je vois comment faire dans ce cas ?
    j'ai essayé différentes surcharges en friend également mais je ne sais pas comment conaitre les bons paramètres à utiliser (type de retour et paramètres à passer)
    je pense que ça pourrais au moins être utile pour apprentissage sinon pour une classe de log
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par shenron666
    je ne comprend pas pourquoi je ne peux prototyper la méthode dans le .h et la déclarer dans le .cpp sans avoir d'erreurs de liens non résolus
    Il y a moyen, mais les compilateurs qui supportent ça sont rares. Il faut utiliser export (liens vers un texte en anglais).

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 01/03/2012, 10h34
  2. Réponses: 6
    Dernier message: 21/07/2009, 13h53
  3. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  4. Réponses: 3
    Dernier message: 08/07/2008, 15h06
  5. Réponses: 9
    Dernier message: 19/05/2007, 15h28

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