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:
1 2 3
| struct Component {};
struct Position : Component {int x;};
struct Health : Component {}; |
Et puis j'ai une structure System :
Code:
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:
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:
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 :aie:
Donc, question : qu'ai-je fait de mal ? :mrgreen:
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:
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:
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 ! |