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

SL & STL C++ Discussion :

Pointeurs de fonction en map


Sujet :

SL & STL C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Pointeurs de fonction en map
    Bonjour,
    je voudrai sauvegarder des pointeurs de fonctions dans une map et utiliser leurs noms comme clé de la map sauf que mon code ne se compile pas,
    Pourriez vous m'aider svp

    voila le code en question:

    le prototype de ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option* BSCall::BSCall_factory(std::istream &st)
    le reste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef Option* (*PF)(std::istream&);
    std::map<std::string,PF>io_map;
     
    io_map["BSCall"]=&BSCall::BSCall_factory;
    je compte sur vous

  2. #2
    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
    Une fonction membre n'est pas une fonction libre.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Ce que veut dire loufoque, c'est que ton typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef Option* (*PF)(std::istream&);
    correspond à une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option* BSCall_factory(std::istream &st)
    mais pas une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option* BSCall::BSCall_factory(std::istream &st)
    La différence entre ces 2 fonctions est que la 2eme est membre de classe et donc possède un paramètre implicite de plus qui est le pointeur this.

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option* BSCall_factory(std::istream &st)
    est différent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Option* BSCall::BSCall_factory(std::istream &st)
    C'est pour cela que cela ne va pas dans ta map

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    merci de vos reponses les gas;
    J'ai compris vos réponses mais je ne sais toujours pas comment regler le probléme,
    effectivement mes fonctions sont des methodes membres mais, justement, je les ai déclarées static en pensant que ça réglera le probléme,

    y aurrait il une autre façon de résoudre ça?

  5. #5
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    [
    Citation Envoyé par chumi Voir le message
    effectivement mes fonctions sont des methodes membres mais, justement, je les ai déclarées static en pensant que ça réglera le probléme,
    Et ça le règle !
    Ce code compile correctement chez moi (sous visual 2008).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class BSCall
    {
    public:
    	static Option* Factory(std::istream& is){return new Option();}	
    };
     
    typedef Option* (*PF)(std::istream&);
    std::map<std::string, PF> io_map;
     
    io_map["BSCall"]=&BSCall::Factory;
    Option* option = io_map["BSCall"](std::cin);
    De mon coté, j'ai tenté de faire joujou avec avec le TR1 à coup de function et bind pour contourner le problème des fonctions membre non statique...
    Ben epic fail.
    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
     
    class Option
    {
    };
     
    class BSCall
    {
    public:
    	Option* Factory(std::istream& is){return new Option();}	
    };
     
    int main()
    {
    	typedef std::tr1::function<Option* (BSCall*, std::istream&)> FactoryFunc;
    	std::map<std::string, FactoryFunc> io_map;
     
    	BSCall bscall;
    	io_map["BSCall"]=std::tr1::bind(&BSCall::Factory, &bscall, std::cin);
    }
    A la ligne io_map["BSCall"]=std::tr1::bind(&BSCall::Factory, &bscall, std::cin); :
    error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    slt arzar,
    le méme code ne compile pas chez moi avec visual2008
    donc j'ai enlevé static et j'ai changé le typedef:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef Option* (BSCall::*PF)(std::istream&);
    std::map<std::string, PF> io_map;
    et ça compile!
    sauf qu'avec ça j'ai un autre probléme,
    dans mon programme j'ai deux fonction membres de deux classes différentes dérivée de la méme classe mére mais qui ont le méme prototype et avec la definition ci dessus, ça ne passe que pour une seule classe

  7. #7
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Oui bien sur, c'est logique. Si on lie le pointeur de fonction à BSClass*, alors on lie aussi la map, et tout ça n'a plus beaucoup d'intérêt.

    Mais quand même, je suis perplexe.
    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>
    #include <map>
    #include <string>
     
    class Option
    {
    };
     
    class BSCall
    {
    public:
    	static Option* Factory(std::istream& is){return new Option();}	
    };
     
    int main()
    {
    	typedef Option* (*PF)(std::istream&);
    	std::map<std::string, PF> io_map;
     
    	io_map["BSCall"]=&BSCall::Factory;
    	Option* option = io_map["BSCall"](std::cin);
    }
    Ce code ne compile pas avec ton Visual ? C'est vraiment très étrange... Quels sont les messages d'erreurs ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ton code Arzar compile aussi chez moi( ç logique )
    mais dans mon programme ça marche pas!

    voila ce que j'ai:

    Dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef Option* (*PF)(std::istream&);
        std::map<std::string, PF> io_map;
        io_map["BSCall"]=&BSCall::BSCall_factory;
    Dans la classe BSCall

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static Option* BSCall_factory(std::istream &st)
    les erreurs:

    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
    1>------ Début de la génération : Projet : VaR, Configuration : Debug Win32 ------
    1>Compilation en cours...
    1>VaR.cpp
    1>c:\documents and settings\amine\bureau\var\var\var.cpp(101) : warning C4244: 'initialisation' : conversion de 'double' en 'long', perte possible de données
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : impossible de déduire l'argument modèle pour 'const std::_Tree<_Traits> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(1466) : voir la déclaration de 'std::operator <'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\functional(142) : lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1>        c:\program files\microsoft visual studio 9.0\vc\include\map(68) : voir la référence à l'instanciation de la classe modèle 'std::less<_Ty>' en cours de compilation
    1>        with
    1>        [
    1>            _Ty=std::string
    1>        ]
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(22) : voir la référence à l'instanciation de la classe modèle 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>' en cours de compilation
    1>        with
    1>        [
    1>            _Kty=std::string,
    1>            _Ty=PF ,
    1>            _Pr=std::less<std::string>,
    1>            _Alloc=std::allocator<std::pair<const std::string,PF >>,
    1>            _Mfl=false
    1>        ]
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(63) : voir la référence à l'instanciation de la classe modèle 'std::_Tree_nod<_Traits>' en cours de compilation
    1>        with
    1>        [
    1>            _Traits=std::_Tmap_traits<std::string,PF ,std::less<std::string>,std::allocator<std::pair<const std::string,PF >>,false>
    1>        ]
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(89) : voir la référence à l'instanciation de la classe modèle 'std::_Tree_ptr<_Traits>' en cours de compilation
    1>        with
    1>        [
    1>            _Traits=std::_Tmap_traits<std::string,PF ,std::less<std::string>,std::allocator<std::pair<const std::string,PF >>,false>
    1>        ]
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(107) : voir la référence à l'instanciation de la classe modèle 'std::_Tree_val<_Traits>' en cours de compilation
    1>        with
    1>        [
    1>            _Traits=std::_Tmap_traits<std::string,PF ,std::less<std::string>,std::allocator<std::pair<const std::string,PF >>,false>
    1>        ]
    1>        c:\program files\microsoft visual studio 9.0\vc\include\map(78) : voir la référence à l'instanciation de la classe modèle 'std::_Tree<_Traits>' en cours de compilation
    1>        with
    1>        [
    1>            _Traits=std::_Tmap_traits<std::string,PF ,std::less<std::string>,std::allocator<std::pair<const std::string,PF >>,false>
    1>        ]
    1>        c:\documents and settings\amine\bureau\var\var\var.cpp(392) : voir la référence à l'instanciation de la classe modèle 'std::map<_Kty,_Ty>' en cours de compilation
    1>        with
    1>        [
    1>            _Kty=std::string,
    1>            _Ty=PF
    1>        ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : impossible de déduire l'argument modèle pour 'const std::_Tree<_Traits> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(1466) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : impossible de déduire l'argument modèle pour 'const std::_Tree<_Traits> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(1466) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : impossible de déduire l'argument modèle pour 'const std::_Tree<_Traits> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xtree(1466) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : impossible de déduire l'argument modèle pour 'const std::list<_Ty,_Ax> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\list(1310) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : impossible de déduire l'argument modèle pour 'const std::list<_Ty,_Ax> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\list(1310) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : impossible de déduire l'argument modèle pour 'const std::list<_Ty,_Ax> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\list(1310) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : impossible de déduire l'argument modèle pour 'const std::list<_Ty,_Ax> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\list(1310) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : impossible de déduire l'argument modèle pour 'const std::vector<_Ty,_Alloc> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(1320) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : impossible de déduire l'argument modèle pour 'const std::vector<_Ty,_Alloc> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(1320) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : impossible de déduire l'argument modèle pour 'const std::vector<_Ty,_Alloc> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(1320) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : impossible de déduire l'argument modèle pour 'const std::vector<_Ty,_Alloc> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\vector(1320) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : impossible de déduire l'argument modèle pour 'const std::reverse_iterator<_RanIt> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2236) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : impossible de déduire l'argument modèle pour 'const std::reverse_iterator<_RanIt> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2236) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : impossible de déduire l'argument modèle pour 'const std::reverse_iterator<_RanIt> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2236) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : impossible de déduire l'argument modèle pour 'const std::reverse_iterator<_RanIt> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2236) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : impossible de déduire l'argument modèle pour 'const std::_Revranit<_RanIt,_Base> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2046) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : impossible de déduire l'argument modèle pour 'const std::_Revranit<_RanIt,_Base> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2046) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : impossible de déduire l'argument modèle pour 'const std::_Revranit<_RanIt,_Base> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2046) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : impossible de déduire l'argument modèle pour 'const std::_Revranit<_RanIt,_Base> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2046) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : impossible de déduire l'argument modèle pour 'const std::pair<_Ty1,_Ty2> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(84) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : impossible de déduire l'argument modèle pour 'const std::pair<_Ty1,_Ty2> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(84) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : impossible de déduire l'argument modèle pour 'const std::pair<_Ty1,_Ty2> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(84) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : impossible de déduire l'argument modèle pour 'const std::pair<_Ty1,_Ty2> &' à partir de 'const std::string'
    1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(84) : voir la déclaration de 'std::operator <'
    1>c:\program files\microsoft visual studio 9.0\vc\include\functional(143) : error C2676: '<' binaire : 'const std::string' ne définit pas cet opérateur ou une conversion vers un type acceptable pour l'opérateur prédéfini
    1>Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\Amine\Bureau\VaR\VaR\Debug\BuildLog.htm"
    1>VaR - 25 erreur(s), 1 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  9. #9
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Je vois le futur...
    Je vois...
    Que dans exactement trois secondes, tu vas t'exclamer "AMAISOUIBIENSUR"
    3
    2
    1
    ...
    (pour pouvoir faire le "BSCall" de io_map["BSCall"])

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Olala, la honte...
    incroyable!

    merci Arzar, j'étais bloqué sur ça depuis hier
    tu es génial

    mais dis, pour dormir ce soir moins bête,
    comment t'a réussi à voir cette erreur dans le listing d'erreurs ci dessus,
    moi, à chaque fois que je tombe sur une erreur pareille je sais plus à quelle ligne il faut lire!

    ça sera sympa de ta part

    et puis merci pour toutes tes réponses

  11. #11
    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
    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
    class Option
    {
    };
     
    class BSCall
    {
    public:
    	Option* Factory(std::istream& is){return new Option();}	
    };
     
    int main()
    {
    	typedef std::tr1::function<Option* (BSCall*, std::istream&)> FactoryFunc;
    	std::map<std::string, FactoryFunc> io_map;
     
    	BSCall bscall;
    	io_map["BSCall"]=std::tr1::bind(&BSCall::Factory, &bscall, std::cin);
    }
    Ce n'est pas comme ça que fonctionne bind :

    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
    class Option
    {
    };
     
    class BSCall
    {
    public:
    	Option* Factory(std::istream& is) const {return new Option();}	
    };
     
    int main()
    {
    	typedef std::tr1::function<Option* (std::istream&)> FactoryFunc;
    	std::map<std::string, FactoryFunc> io_map;
     
    	BSCall bscall;
    	io_map["BSCall"]=std::tr1::bind(&BSCall::Factory, &bscall);
     
            delete io_map["BSCall"](std::cin);
    }

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par chumi Voir le message
    mais dis, pour dormir ce soir moins bête,
    comment t'a réussi à voir cette erreur dans le listing d'erreurs ci dessus,
    moi, à chaque fois que je tombe sur une erreur pareille je sais plus à quelle ligne il faut lire!
    Ben c'est qu'à force de se prendre des messages d'erreurs de la STL dans les dents, on finit par comprendre à peu près comment ça marche (mais on a des mauvaises dents, comme lui -> )

    Par exemple, si on reprend l'erreur :
    *'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : impossible de déduire l'argument modèle pour 'const std::_Tree<_Traits> &' à partir de 'const std::string'
    c:\program files\microsoft visual studio 9.0\vc\include\xtree(1466) : voir la déclaration de 'std::operator <'
    1> c:\program files\microsoft visual studio 9.0\vc\include\functional(142) : lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1> c:\program files\microsoft visual studio 9.0\vc\include\map(68) : voir la référence à l'instanciation de la classe modèle 'std::less<_Ty>' en cours de compilation
    1> with

    ....

    La règle de base c'est de se concentrer uniquement sur la première ligne, car en général la moindre erreur dans la STL provoque un effet domino et génère tout un fatras de plus en plus incompréhensible.

    1) bool std::operator <
    Ça c'est l'opérateur de comparaison utilisée en interne dans les maps. Donc déjà il y a l'air d'avoir un problème avec une map.

    2) (const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)
    "Tree". Or les maps sont quasiment toutes implémentées sous forme d'arbre. Ça se précise.

    3) impossible de déduire l'argument modèle pour
    En anglais, "template argument", donc il y a un problème de template quelque part.

    4) const std::_Tree<_Traits> &' à partir de 'const std::string'
    Problème avec les strings.

    Donc au final, en gros il y a un problème dans une map avec des templates et des strings.
    Et ça là qu'intervient l'expérience (douloureuse en général). J'avais déjà eu le même problème il y a quelques temps. Pour manier des string, il suffit généralement d'inclure <iostream>, sauf si l'on veut utiliser le type string dans un template (ex : std::vector<std::string>>), auquel cas il faut aussi inclure <string>. C'est assez vexant comme erreur.

    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
    class Option
    {
    };
     
    class BSCall
    {
    public:
    	Option* Factory(std::istream& is) const {return new Option();}	
    };
     
    int main()
    {
    	typedef std::tr1::function<Option* (std::istream&)> FactoryFunc;
    	std::map<std::string, FactoryFunc> io_map;
    	
    	BSCall bscall;
    	io_map["BSCall"]=std::tr1::bind(&BSCall::Factory, &bscall, _1);
     
            delete io_map["BSCall"](std::cin);
    }
    Alors ça, ça c'est vraiment bien !
    Merci pour ce code Loufoque, je crois que je commence à comprendre l'intérêt de function/bind du coup. Je vais essayer de recoder un pattern observer, comme boost.signal, à titre d'exercice.

    (et sinon en recherchant "boost bind function" dans google, on peut trouver une ébauche d'un tuto developpez. Un petit mot là dessus Alp? )

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Arzar

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/01/2013, 13h58
  2. Pointeur de fonction, Template, map et autres joyeusetés
    Par K2R Nolween dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2009, 05h14
  3. Réponses: 5
    Dernier message: 17/05/2007, 19h12
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 11h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 15h39

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