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 ! |