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 :

Pointeur de fonction avec template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut Pointeur de fonction avec template
    Salut à tous,
    Ma question est simple : comment passer un pointeur de fonction avec template, comme argument d'une autre fonction avec template ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <class T>
    void func_templ(T) {};
     
    void func(void (*)(int)) {};
     
    template <class U>
    void func2(U) {};
     
    int main (void)
    {    
        func2(func_templ);
        return 0;
    }
    Si je remplace func2(func_templ) par func(func_templ), tout est ok (pas d'erreur).
    Cependant, avec func2, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -Wall -o c.o c.cpp && ./c.o
    c.cpp: In function 'int main()':
    c.cpp:13: error: no matching function for call to 'func2(<unresolved overloaded function type>)'
    En fait la fonction func2 ne parvient pas à définir le type U si on lui donne comme argument un pointeur de fonction à template.
    Quelle est la solution ?
    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Bonjour,
    est une classe template, pour l'utiliser il faut qu'elle soit typée.
    C'est à dire:
    Essaye avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    func2(func_templ<Mon type>);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Salut,
    Merci pour ta réponse, c'est bien ça !
    Le problème, c'est que ça ne m'arrange pas car si je me suis posé cette question, c'est pour pouvoir en fait définir une interface à ostream, pour overloader l'opérateur <<, et définir des opérations supplémentaires lors d'une écriture sur le stream :
    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
    #include <iostream>
     
    class ostreamInterface : public std::ostream
    {
    	protected:
    		std::ostream m_ostream;
    	public:
    		ostreamInterface(std::streambuf *streambuf_tmp) :
    			m_ostream(streambuf_tmp) {};
    		template <class T>
    		ostreamInterface& operator<<(T arg)
    		{
    			std::cout << arg;
    			return *this;
    		}
    };
     
    int main (void)
    {    
    	ostreamInterface ma_stream(std::cout.rdbuf());
    	ma_stream << "strin";
        return 0;
    }
    Le problème, c'est que si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_stream << std::endl;
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g++ -Wall -o p.o p.cpp && ./p.o
    p.cpp: In function ‘int main()’:
    p.cpp:21: error: no match foroperator<<’ in ‘ma_stream << std::endl’
    /usr/include/c++/4.4/ostream:488: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.4/ostream:446: note:                 std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
    Je pense que les problèmes sont liés, puisque std::endl est un pointeur de fonction avec template (prenant un basic_ostream <...> en argument).
    Auriez-vous idée pour pouvoir malgré tout overloader << ? Merci !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Pour moi le problème est que endl ne fait n'appartient pas directement à ostream. C'est un manipulateur d'ostream et (mais je dis peut-être une bêtise) ta classe qui hérite d'ostream n'est donc pas manipulable par endl. Il faudrait peut-être modifier endl.

    Si tu crées un pointeur de type ostreamInterface
    alors tu t'apercois que le compilateur ne sait pas résoudre le type pour le endl.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ostreamInterface * ma_stream = new ostreamInterface(std::cout.rdbuf());
      ma_stream->operator<<(std::endl);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ostreamInterface * ma_stream = new ostreamInterface(std::cout.rdbuf());
      ma_stream->operator<<(std::endl);
    Je ne suis pas sur que implémenter une nouvelle classe héritant directement de ostream soit trivial.

    Il faudrait que tu dises exactement ce que tu veux faire et voire si il n'y a pas un moyen plus simple, car en touchant a ostream on touche au classes traits et là il vaut mieux bien maitriser

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    La question que je me pose en lisant ton code, c'est : « Pourquoi y a-t-il un champ de type std::ostream dans une classe qui dérive de std::osteam ? »
    Ça fait au final deux instances de « std::ostream » pour une instance de « ostreamInterface ».
    Ce n'est pas un peu beaucoup ?

    Et écrire des manipulateurs de flux comme « std::endl » ou les « iomanip » ne suffirait pas pour tes besoins ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Bonjour,
    Merci à tous,
    Effectivement, c'était inutile d'hériter d'ostream, j'ai donc enlever et redéfinit mes manipulateurs, ce qui est bien plus simple. Merci !

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

Discussions similaires

  1. Pointeur de fonction avec les templates
    Par ZeRevo dans le forum Langage
    Réponses: 5
    Dernier message: 18/01/2011, 08h57
  2. Pointeur de fonction et template ?
    Par jamesb dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2009, 17h47
  3. Pointeur de fonction membre template
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 12/12/2006, 14h47
  4. Réponses: 13
    Dernier message: 03/10/2005, 18h06
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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