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 :

template pour du traitement de donnée. erreur de compilation.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 2
    Par défaut template pour du traitement de donnée. erreur de compilation.
    Bonjour,

    J'ai un souci et je ne sais pas trop comment m'en sortir. J'aimerais faire un template pour traiter des données. Voici un code minimal ci-dessous.

    Cela marche très bien si P est directement une classe. Mais je voudrais aussi pouvoir utiliser P comme un pointeur de classe (voir main).
    Comment dois-je ecrire la fonction process pour que ce template fonctionne dans les deux cas ?

    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
    #include <iostream>
    #include <vector>
     
    template<typename T, typename P> class DataProcessor {
      P mProcessor;
      std::vector<T> mData;
     
    public:
      void push_back(const T& data) {
        mData.push_back(data);
      }
     
      void set(const P& processor) {
        mProcessor = processor;
      }
     
      P& get() {
        return mProcessor;
      }
     
      void process() {
        for (typename std::vector<T>::iterator it = mData.begin(); it != mData.end(); ++it) {
          mProcessor.process(*it);
        }
      }
    };
     
    class PrintData {
      std::string mPrefix;
    public:
     
      void prefix(std::string prefix) {
        mPrefix = prefix;
      }
     
      void process(int i) {
        std::cout<<mPrefix<<" : "<<i<<std::endl;
      }
    };
     
    int main() {
      DataProcessor<int, PrintData> p1;
      p1.get().prefix("prefix");
      p1.push_back(1);
      p1.push_back(2);
      p1.push_back(3);
      p1.process();
     
      PrintData* pdata = new PrintData;
      pdata->prefix("prefix");
      DataProcessor<int, PrintData*> p2;
      p2.set(pdata);
      p2.push_back(1);
      p2.push_back(2);
      p2.push_back(3);
      p2.process();
    }
    Voici l'erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ g++ -o main main.cc
    main.cc: In member function ‘void DataProcessor<T, P>::process() [with T = int, P = PrintData*]’:
    main.cc:56:   instantiated from here
    main.cc:23: error: request for member ‘process’ in ‘((DataProcessor<int, PrintData*>*)this)->DataProcessor<int, PrintData*>::mProcessor’, which is of non-class type ‘PrintData*’

  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
    Pour moi, ton problème vient que lorsque tu déclares dataProcessor (ligne 51) tu pass un pointeur sur printData.
    Donc dans ta classe dataProcessor, mProcessor est un pointeur sur printData. Ceci ne pose pas de problème, mais comme dans ta méthode process tu fait mProcessor.process, celà ne peut pas marcher sur un pointeur. Il faudrait que ta méthode fasse mProcessor->process().
    Il te faudrait donc pouvoir déterminer si tu passes un pointeur ou pas pour appeller correctement la méthode.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 2
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    Pour moi, ton problème vient que lorsque tu déclares dataProcessor (ligne 51) tu pass un pointeur sur printData.
    Donc dans ta classe dataProcessor, mProcessor est un pointeur sur printData. Ceci ne pose pas de problème, mais comme dans ta méthode process tu fait mProcessor.process, celà ne peut pas marcher sur un pointeur. Il faudrait que ta méthode fasse mProcessor->process().
    Il te faudrait donc pouvoir déterminer si tu passes un pointeur ou pas pour appeller correctement la méthode.

    exact ! et comment puis-je déterminer ça dans ma class dataProcessor ?

  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 l'instant je ne vois pas vraiment, il y a bien le typeid qui permet de connaitre le type, ce qui couplé à la fonctionnalité name() du type_info de permettrai de récupérer le nom de l'objet que tu analyses pour savoir si c'est un pointeur ou non, mais le problème c'est que la norme n'impose pas la facon d'écrire le nom. Moi pour un pointeur il y a un P masjuscule devant le nom du type.
    L'autre solution consiste à fournir une méthode pour traiter le cas d'un pointeur.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    La solution c'est de ne pas utiliser de pointeur dans les types de ta classe template. Dit autrement, p1 et bien déclaré, mais p2 n'est pas bon.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Une solution est de spécialisatier partiellement ta classe quand P représente un pointeur. Soucis, on va dupliquer la code de façon "inutile".
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. Framework pour les traitements de données par lot
    Par rahma2 dans le forum Frameworks Web
    Réponses: 0
    Dernier message: 01/07/2015, 13h34
  2. [XL-2013] Problème de macro pour un traitement de données horizontal puis vertical
    Par minh86 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/12/2014, 17h04
  3. quel diagramme pour le traitement des données
    Par Smix007 dans le forum Visio
    Réponses: 0
    Dernier message: 06/08/2012, 17h41
  4. Réponses: 1
    Dernier message: 24/05/2007, 18h09
  5. Réponses: 2
    Dernier message: 15/09/2005, 15h08

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