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 et operator[] ?


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 12
    Points
    12
    Par défaut template et operator[] ?
    Bonjour,

    J'essaie de faire une classe utilisant l'opérateur d'indexation [] mais avec un template qui conditionne le type de retour. Les données sont de type QVariant, et donc l'idée serait de faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int opt1=myclass<QVariant::Int>[index];
    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 MyClass
    {
            template<typename T>
            T&           operator []  (int option)
            {
                QVariant var;
                if(m_options.contains(option))
                    return m_options[option].value<T>();
                else
                    return var.value<T>();
            }
    private:
        QList<QVariant> m_options;
    }
    Quand j'essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int opt1=myclass<QVariant::Int>[1];
    ou même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int opt1=myclass.operator[]<QVariant::Int>(1);
    Mais le compilateur (MinGW) ne reconnaît pas la surcharge et me met :
    no match found ... for operator[]

    D'où la question : est-ce possible de surcharger l'opérateur [] avec un template ? ou est-ce que j'ai mal fait un truc
    Merci d'avance
    RV

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    tu as tenté de le faire avec une fonction nommée f?
    La syntaxe des opérateurs peut parfois donner des surprises.

    par ailleurs, essaie de respecter le type du retour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVariant::Int opt1=myclass.operator[]<QVariant::Int>(index);
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct S
    {
        template <typename T> T operator[](int i) { return T(i); }
    };
     
    int main()
    {
        S s;
        double x = s.operator[]<double>(42);
        int i = s.operator[]<int>(36);
        return 0;
    }
    passe sans probleme ici.

    A noter que dans le code que tu montres, le template est prive.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Effectivement, cette privauté est un problème, si elle est présente dans le code effectif.
    C'est la raison pour laquelle je précise private: en début de classe, même si c'est évident.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Voire peut-être un problème de constness.
    l'instance myclass est-elle const ? l'opérateur ne l'étant pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Si c'est un copié collé de ta classe bah met public: sur la ligne au dessus de ton operateur de base c'est en private.

Discussions similaires

  1. operator() avec les templates
    Par kranagard dans le forum Langage
    Réponses: 6
    Dernier message: 09/02/2011, 15h45
  2. template et operator <<
    Par isoman dans le forum Langage
    Réponses: 5
    Dernier message: 11/03/2008, 20h47
  3. [Débutant]Foncteur et operator() template
    Par Sub dans le forum Langage
    Réponses: 14
    Dernier message: 27/03/2007, 13h51
  4. template et operator +
    Par Fry dans le forum Langage
    Réponses: 15
    Dernier message: 26/06/2006, 20h31
  5. Templates et Operator()
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 14/01/2006, 13h41

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