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 :

Templates, pointeurs et égalités


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut Templates, pointeurs et égalités
    Bonjour à tous,

    J'ai un petit souci de compilation que je n'arrive pas à comprendre. J'ai une classe "template" ARRAY que j'utilise afin de gérer un tableau de pointeurs de type quelconque.

    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
    template<class T>
    class ARRAY
    {
        // mon tableau de pointeurs
        T *_elements;
        // le nombre de pointeurs dans le tableau
        int _size;
     
        // la fonction qui retourne l'indice d'un pointeur passé en param.
        int _search(const T &element) const
        {
            for (int i=0; i<_size; i++)
            {
                if (_elements[i] == element) // ligne où apparaît l'erreur de compilation
                    return i;
            }
        }
     
    }
    J'instancie ce tableau de la manière suivante, afin d'avoir un tableau de pointeurs sur des objets de type MaClasse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARRAY<MaClasse*> _monTableau;
    Or, à la compilation j'ai le message suivant :
    no match for 'operator=='

    Je ne comprends pas pourquoi il n'est pas capable de comparer _elements[i] et element sachant qu'il s'agit de 2 pointeurs tout bête !?

    Merci d'avance pour votre aide, n'hésitez pas s'il vous faut plus de précisions...

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Je ne connais pas suffisamment les templates pour t'aider sur ton probleme particulier, mais pourquoi es tu en train de reinventer la roue ?

    Es tu sur qu'aucun conteneur de la STL ne correspond a tes besoins ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut
    Pour deux raisons :

    1) ce n'est pas mon projet, je ne fais qu'intervenir ponctuellement. La politique étant : on y touche le moins possible.
    2) par curiosité, j'aimerai comprendre

  4. #4
    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
    Si je ne dis pas de bêtises, une classe template est créée à compilation. Donc si quelque part tu utilises ce template avec une classe qui ne possède par d'opérateur ==, le compilateur ne parviendra pas creer cette classe.
    La façon dont cette classe template est construite implique qu'elle ne peut spécialiser que des classes qui implémentent l'opérateur ==.

    voir la faq

  5. #5
    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
    Par défaut
    Aucune erreur de compilation chez moi.
    Voici le code utilisé.

    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
    template<class T>
    class ARRAY
    {
        // mon tableau de pointeurs
        T *_elements;
        // le nombre de pointeurs dans le tableau
        int _size;
     
        // la fonction qui retourne l'indice d'un pointeur passé en param.
        int _search(const T &element) const
        {
            for (int i=0; i<_size; i++)
            {
                if (_elements[i] == element) // ligne où apparaît l'erreur de compilation
                    return i;
            }
            return -1;
        }
     
    };
     
    struct Foo;
     
    int main()
    {
        ARRAY<Foo*> foo;
    }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il me semble que l'erreur ne surviendra que si tu tentes un _search().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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
    Par défaut
    Et pourquoi donc l'erreur se produirait à ce moment ?
    Les erreurs sont détectées quand le template est instancié. Encore heureux.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par loufoque
    Et pourquoi donc l'erreur se produirait à ce moment ?
    Les erreurs sont détectées quand le template est instancié. Encore heureux.
    _search n'est instancié que quand il est utilisé. C'aurait été indéterminé si _search avait été virtuel. Il y a des cas où la résolution de surcharge entraîne l'instantiation de template qui ne sont pas utilisés.

    Essaie d'ajouter quelque chose de manifestement invalide mais dépendant du paramêtre template dans _search (par exemple un appel element.foo()), ton programme doit toujours compiler.

    A noter qu'il me semble me souvenir que certains compilateurs ne respect(ai)ent pas la norme en mode debug.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    J'aimerais bien un exemple COMPLET et n'ayant comme problème empéchant la compilation que celui-ci.

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Par défaut
    @loufoque : effectivement, j'ai extrait le code qui posait problème pour le compiler à part et cela fonctionne.

    J'ai trouvé d'où venait le problème, il ne s'agissait finalement pas d'une instanciation via un pointeur (ex : ARRAY<MaClasse*>) mais d'une autre instanciation qui m'avait échappée.

    Celle-ci était bien du type ARRAY<MaClasseB> (sans pointeur donc) et MaClasseB ne définissait effectivement pas opérateur==.


    Merci à tous pour votre aide.

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

Discussions similaires

  1. [DJANGO]Templates, tag et égalité
    Par GrimaudClement dans le forum Django
    Réponses: 8
    Dernier message: 28/11/2013, 18h13
  2. [template] template, pointeur et allocation
    Par r0d dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2011, 13h57
  3. template, pointeur de fonction et déclaration
    Par mensoif dans le forum Langage
    Réponses: 4
    Dernier message: 01/06/2010, 00h31
  4. [Template] Pointeur sur classe template
    Par Kromagg dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2008, 16h01
  5. Template & pointeurs
    Par Apocalipsia` dans le forum Langage
    Réponses: 24
    Dernier message: 18/07/2008, 09h04

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