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 :

Non-const lvalue reference to type() cannot bind to a value of unrelated type()


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut Non-const lvalue reference to type() cannot bind to a value of unrelated type()
    Bonjour,

    J'ai une structure Component, et deux autres structures Position et Health :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Component {};
    struct Position : Component {int x;};
    struct Health : Component {};
    Et puis j'ai une structure System :

    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<typename...T>
    struct System
    {
        std::vector<Component*> vector;
        std::tuple<T...> tuple;
     
        System()
        {
            vector.push_back(new Position);
            vector.push_back(new Health);
            static_cast<Position*>(vector[0])->x = 34;
        }
     
        template <size_t i>
        decltype(std::get<i>(tuple)) component()
        {
            return static_cast<decltype(std::get<i>(tuple))>(*vector[i]);
        }
    };
    Et dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System<Position,Health> system;
    std::cout<<system.component<0>().x; // affiche 34 en console
    Ça compile, tout va bien. Mon problème vient du fait que j'aimerais pouvoir modifier ce chiffre 34.
    J'ai donc fait quelques modifications :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::tuple<T*...> tuple; // au lieu de std::tuple<T...> tuple;
    return static_cast<decltype(std::get<i>(tuple))>(vector[i]); // au lieu de return static_cast<decltype(std::get<i>(tuple))>(*vector[i]);
    system.component<0>()->x++; // dans le main
    Mais mon compilateur refuse de coopérer, avec le message d'erreur du titre.. Je comprends pas son histoire de unrelated type, Component* et Position* sont related, c'est le polymorphisme tout ça

    Donc, question : qu'ai-je fait de mal ?
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Il y a vraiment marquer type() dans l'erreur ? C'est pas clair comme truc.

    Je tente quand même: le proto a aussi été changé ?

    Sinon, si le tuple n'est pas utilisé, tu peux passer par std::tuple_element.
    En plus j'ai l'impression que std::get retourne une référence, alors je ne vois pas pourquoi passer par un pointeur pour modifier l'objet. Et s'il ne retourne pas de référence, Il y a aussi moyen de la forcer en double parenthèsant decltype.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;
    decltype(i) ii = i; // int
    decltype((i)) ii = i; // int &

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut Non-const lvalue reference to type() cannot bind to a value of unrelated type()
    Non y a pas marqué type(), y a marqué :
    Non-const lvalue reference to type 'typename tuple_element<0UL, tuple<Position *, Health *> >::type' (aka 'Position *') cannot bind to a value of unrelated type 'value_type' (aka 'Component *')

    Le proto n'a pas besoin d'être changé en fait, puisque tuple<T*....> stocke des T*, la fonction est censée retourner un T* aussi. Enfin je pense.

    En fait quand tu me dis que std::get donne une référence, tout s'éclaire, j'étais juste passé à côté de ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    system.component<0>().x++;
    std::cout<<system.component<0>().x; // affiche 35
    Au début, je prenais ça pour une erreur de pointeur, style j'ai lâché le pointeur mais coup de chance, la valeur est toujours bonne. En fait c'est tout bon, d'ailleurs en utilisant les tuple_element ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <size_t i>
        typename std::tuple_element<i,std::tuple<T*...>>::type component()
        {
            return static_cast<typename std::tuple_element<i,std::tuple<T*...>>::type>(vector[i]);
        }
     
    system.component<0>()->x++; // ça marche !
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

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

Discussions similaires

  1. Type de Bind variables
    Par kervoaz dans le forum SQL
    Réponses: 6
    Dernier message: 19/05/2008, 17h21
  2. Hack const --> non const ?
    Par befalimpertinent dans le forum C++
    Réponses: 15
    Dernier message: 06/03/2008, 15h11
  3. Réponses: 7
    Dernier message: 30/08/2007, 14h17
  4. [WCF] Récupération du type de Binding
    Par NicolasR dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 14/02/2007, 17h36
  5. Réponses: 18
    Dernier message: 19/10/2006, 12h02

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