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 membre template


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut Pointeur de fonction membre template
    Bonsoir,

    Petit problème pour utiliser un pointeur de fonction membre template. VOilà le code qui me pose problème :

    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
     
    template <class Derived> class FSM {
     
        template <
            class Event,
            int NextState,
            void (Derived::*action)(const Event&),
            bool (Derived::*guard)(const Event&) = &Derived::true_ //<=Ligne qui pose problème
        >
        struct transition {
            //...
        };
     
        ...
    };
     
    class MyFSM : public FSM<MyFSM> {
     
    //...
     
        template <class Event>
        bool true_(const Event& e) {return true;}
     
    };
    Lors de la compilation, j'ai l'erreur suivante à la ligne qui pose problème :
    incomplete type MyFSM used in nested name specifier

    Je pense que cela vient du fait que ma fonction true_ est une fonction template et qu'il faut le spécifier au compilo, malheureusement je ne sais pas si cela est possible, et si oui quelle est la syntaxe à utiliser.

    Merci d'avance :p

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu peux montrer comment tu essayes d'instance cette classe, et sur quel type ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    En gros :

    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 MyFSM : public FSM<MyFSM> {
     
    //...
     
        typedef MyFSM fsm;
     
        struct transition_table : mpl::vector3 <
     
            state< Start, &fsm::action_in, &fsm::action_out, mpl::vector2<
                   transition< Event, NextSate, &fsm::next >,
                   transition< Event2, NextSTate2, &fsm::next2, &fsm::guard > >,
            state< //.. etc
     
        > {};
     
    };
    state étant une autre structure définie dans FSM. Je peux mettre le code entier si tu préfère mais c'est un peu long et je sais pas si ça apporte grand chose.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Bon apparemment ça n'a rien à voir avec le fait que ce soit une fonction membre template, si j'en fais une fonction membre classique, j'ai toujours le même souci.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    J'avoue que ce genre de chose atteind les limites de ce que je peux faire sans avoir un compilateur pour m'aider... Et j'ai vu un problème dans ton code :
    Citation Envoyé par La norme, §14.1.9
    A default templateargument shall not be specified in a function template declaration or a function template definition, nor in the templateparameterlist of the definition of a member of a class template.
    Ce qui se traduit pour un exemple plus simple par :
    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
    #include <iostream>
    using namespace std;
     
    template <class T>
    struct A
    {
    	template <int i = 0>
    	struct C
    	{
    		void f() {cout << i;}
    	};
    };
     
    int main()
    {
    	A<int>::C<> c;
    	c.f();
     
    }
    Si on rend A non template, ça marche. Là, ça échoue. Il va donc falloir écrire ton code autrement.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Erf dans ce cas là il y a aun problème, car si je remplace le pointeur de fonction membre par une classe, je peux lui passer un paramètre par défaut sans problème :/

    J'aurais pensé que le problème venait du fait que la classe Dérivée (ici MyFSM) était pas encore compilée, du coup il ne peut accéder à aucun de ses membres.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Réponse un peu tardive mais qui pourrait intéresser des gens ayant le même type de problème : le souci vient du fait que j'essaye de caster un pointeur de fonction membre utilisé comme paramètre template. Or cela est interdit comme spécifié dans le standard.

    Par contre si quelqu'un sait pourquoi cela est interdit (ou du moins les problèmes que cela engendrerait si on l'autorisait) je suis preneur .

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

Discussions similaires

  1. Pointeur sur une fonction membre templatée et +
    Par metagoto dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2013, 02h05
  2. Réponses: 5
    Dernier message: 29/12/2005, 21h27
  3. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  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