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

C++ Discussion :

[tr1/memory] Appeler get_deleter dans un template


Sujet :

C++

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut [tr1/memory] Appeler get_deleter dans un template
    Bonjour,

    Je tourne en rond depuis plusieurs heures sans trouver la solution. Je n'arrive pas à compiler le morceau de code ci-dessous

    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
    #include <tr1/memory>
     
    class A {};
     
    using ::std::tr1::shared_ptr;
     
    template <class T>
    struct Deleter {
      void operator()(T *t) {
        delete t;
      }
    };
     
    template <class T>
    Deleter<T> *deleter(const shared_ptr <T> & p) {
      return std::tr1::get_deleter<Deleter<T> >(p);
    }
     
    int main () {
      shared_ptr <A> p (new A, Deleter<A>());
      Deleter<A> *d1 = std::tr1::get_deleter<Deleter<A> >(p);
      assert(d1);
      Deleter<A> *d2 = deleter<A>(p);
      assert(d2);
      return 0;  
    }
    J'utilise g++ 4.0.1 et voici l'erreur que j'ai. Je n'ai actuellement pas la possibilité de tester avec un autre compilateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    g++ -Wall -pedantic -o memory memory.cpp
    memory.cpp: In function 'Deleter<T>* deleter(const std::tr1::shared_ptr<_Tp>&)':
    memory.cpp:16: error: 'get_deleter' is not a member of 'std::tr1'
    memory.cpp:16: error: expected primary-expression before '>' token
    Le problème que je vois est que get_deleter est une fonction template amie de shared_ptr mais je ne sais pas comment m'en sortir. Je suis juste arrivé à un moment à compiler avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return std::tr1::shared_ptr<T>::template get_deleter<Deleter<T> >(p);
    mais je n'avais pas encore mis dans le main les lignes avec d2.

    Si quelqu'un a une idée, il est le bienvenu. Merci d'avance,

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Généralement, lorsque tu obtiens une erreur " XXX is not member of YYY", c'est parce que le le compilateur ne trouve pas XXX dans YYY.

    Les trois principales raisons à cet état de fait sont:
    • une faute dans l'orthographe de XXX
    • l'inexistance pure et simple de XXX
    • l'oubli de l'inclusion du fichier d'en-tête dans lequel se XXX est déclaré
    Dans ton cas, je pencherais volontiers pour la troisième solution. Tu dois donc veiller à ce que le fichier (tr1/)memory soit bel et bien inclus (de manière directe ou indirecte) dans le fichier dans lequel tu définis ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    Deleter<T> *deleter(const shared_ptr <T> & p) {
      return std::tr1::get_deleter<Deleter<T> >(p);
    }
    Il va de soi que le dit fichier doit être inclus AVANT que ton code ne fasse appel à std::tr1::geet_deleter
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Je pense simplement qu'il te faut une version de gcc plus récente.
    Find me on github

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    koala01, merci pour ta réponse mais tu auras remarqué dans mon code que j'incluais correctement <tr1/memory> et que get_deleter était bien présent puisque la première ligne dans le main avec d1 compilait, mais c'est vrai que j'avais oublié de le préciser.

    jblecanard, c'est bien un problème de compilateur. C'est ce que j'aurais aimé tester hier mais avec un pauvre modem 56k, on ne va pas très loin. Je viens d'installer gcc 4.5 et ça compile parfaitement. J'ai jeté un coup d'oeil au <tr1/memory> et la définition de get_deleter me convient mieux.

    Bon, ça ne me facilite pas la vie tout cela. Il va falloir que je teste la version de gcc et que j'utilise boost à la place quand la version n'est pas suffisante.

    Bonne soirée.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Tu peux t'aider de ce tableau pour gagner un peu de temps.
    Find me on github

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

Discussions similaires

  1. [1.x] appelle d'une fonction dans le template
    Par scarabe088 dans le forum Symfony
    Réponses: 1
    Dernier message: 13/09/2011, 21h56
  2. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  3. [ZF 1.9] appeler un actionStack dans un template
    Par guiyomh dans le forum Autres composants
    Réponses: 3
    Dernier message: 09/12/2009, 14h23
  4. [WPF][C#] appeler un évenement dans un template
    Par azerty53 dans le forum C#
    Réponses: 2
    Dernier message: 25/01/2008, 18h49
  5. Réponses: 4
    Dernier message: 06/03/2007, 01h57

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