+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Inscrit en
    février 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 9
    Points : 0
    Points
    0

    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 :
    int opt1=myclass<QVariant::Int>[index];
    Code :
    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 :
    int opt1=myclass<QVariant::Int>[1];
    ou même
    Code :
    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 Confirmé Sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 338
    Points : 5 502
    Points
    5 502

    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 :
    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.
    • 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 Confirmé Sénior

    Inscrit en
    novembre 2005
    Messages
    5 122
    Détails du profil
    Informations forums :
    Inscription : novembre 2005
    Messages : 5 122
    Points : 6 771
    Points
    6 771

    Par défaut

    Code :
    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 Confirmé Sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : juin 2007
    Messages : 2 338
    Points : 5 502
    Points
    5 502

    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.
    • 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
    Modérateur

    Homme Profil pro
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 286
    Points : 5 993
    Points
    5 993

    Par défaut

    Voire peut-être un problème de constness.
    l'instance myclass est-elle const ? l'opérateur ne l'étant pas.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2010
    Messages : 434
    Points : 640
    Points
    640

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •