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 :

Appel de structure templatée


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut Appel de structure templatée
    Bonjour !

    J'ai une structure templatée, que je spéciliase:
    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
                template<typename HandlingResult, typename Protocol>
                struct handle_result
                {
                    static session<Protocol>* call(const HandlingResult& hr, session<Protocol>* original_session, socket_impl<Protocol>& s)
                    {
                        std::cout << "default"<<std::endl;
                        return original_session;
                    }
                };
     
    /// SPECIALISATION
            template<typename Protocol>
            struct packet::handle_result<handlers::received_pong, Protocol>
            {
                session<Protocol>* call(const handlers::received_pong& hr, session<Protocol>* original_session, socket_impl<Protocol>& s)
                {
                    if(std::chrono::system_clock::now() - config::ping_timeout > original_session.mark())
                    {
                        throw handlers::remove_client();
                    }
                    return original_session;
                }
            };
            template<typename Protocol>
            struct packet::handle_result<handlers::handling_result, Protocol>
            {
                session<Protocol>* call(const handlers::handling_result& hr, session<Protocol>* original_session, socket_impl<Protocol>& s)
                {
                    return original_session;
                }
            };
            template<typename Protocol>
            struct packet::handle_result<handlers::change_handler<sessions::server<Protocol>>, Protocol>
            {
                session<Protocol>* call(const handlers::change_handler<sessions::server<Protocol>>& hr, session<Protocol>* original_session, socket_impl<Protocol>& s)
                {
                    std::cout << "changing server handler "<<std::endl;
                    std::cout << original_session << " to "<<std::endl;
                    templates::realloc_pointer<session<Protocol>, sessions::server<Protocol>>::call(original_session, s, hr.some_id);
                    std::cout << original_session<<std::endl;
                    return original_session;
                }
            };
            template<typename Protocol>
            struct packet::handle_result<handlers::change_handler<sessions::update_server<Protocol>>, Protocol>
            {
                session<Protocol>* call(const handlers::change_handler<sessions::update_server<Protocol>>& hr, session<Protocol>* original_session, socket_impl<Protocol>& s)
                {
                    templates::realloc_pointer<session<Protocol>, sessions::update_server<Protocol>>::call(original_session, s, hr.some_id);
                    return original_session;
                }
            };

    Plus loin, j'appelle la fonction call:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                                        net::session<Protocol>* session_cpy(
                                                packet::handle_result<decltype(result), Protocol>::call(result, session, socket)
                                        );
    Tout devrait être bon, j'appelle une fonction statique, et j'ai cette erreur:
    cannot call member function 'net::session<Protocol>* net::iopacket::packet::handle_result<net::handlers::handling_result, Protocol>::call(const net::handlers::handling_result&, net::session<Protocol>*, net::socket_impl<Protocol>&) [with Protocol = net::protocols::TCP]' without object
    Je ne comprend pas pourquoi :O
    Pourriez vous m'expliquer ?

    merci

    nico

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Surement une erreur d'inattention mais tu n'as pas remis le mot-clé static devant les méthodes des spécialisations

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    C'est parce que dans ta spécialisation, tu as retiré le qualificateur "static" de la fonction call():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static session<Protocol>* call(...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     session<Protocol>* call(...)

  4. #4
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    Ah oui en effet, petite erreur toute bête.
    Bon alors je vais légèrement modifier le problème.

    Voici une classe mère, ainsi qu'une fille (simple exemple...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class handling_result
            {
            public:
                handling_result(bool empty = true) : m_empty(empty) {}
                inline bool empty() const { return m_empty; }
            private:
                bool m_empty;
            };
            class blocked_packet: public handling_result
            {
            public:
                blocked_packet(packet_def::packet_header_t h) : handling_result(false), code(h) {}
                const packet_def::packet_header_t code;
            };
    L'interet de ma fonction templatée, c'est du coup de pouvoir avoir un comportement spécifique en fonction du template, logique non ?

    Dans ma boucle principale j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                                        net::session<Protocol>* session_cpy(
                                                packet::handle_result<decltype(result), Protocol>::call(result, session, socket)
                                        );
    qui devrait appeller donc cette fonction, et le template devrait fonctionner non ?!

    Le soucis, c'est que c'est toujours le template par defaut qui est executé (std::cout << "default" << std::endl

    Comment puis-je fair epour que cela fonctionne ?

    Merci pour la première réponse ^^

    nico

  5. #5
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    La solution était de mettre en place un pattern Visiteur.
    Le vrai problème était de mélanger runtime & compile time... vive les templates ^^

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

Discussions similaires

  1. Appeler deux proc templates
    Par Deciprog dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 30/11/2008, 18h35
  2. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  3. [PHPLIB] Faire appel à un fichier template de plus en cours de route
    Par zulot dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 01/04/2006, 11h38
  4. Appel recursif avec template
    Par Math75 dans le forum Langage
    Réponses: 24
    Dernier message: 13/10/2005, 11h57
  5. appel d un template mais sans etre ds le bon node
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/09/2005, 15h46

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