Le compilateur MS VS x86 n’a aucun problème avec les définitions suivantes, mais GCC (ARM) se plaint. GCC est-il stupide ou MSVS_x86 est-il trop intelligent?
bool checkPointInside(const CIwVec2& globalPoint) { return checkPointIn(globalPoint, CIwVec2()); }; /// error: no matching function for call to 'Fair::Sprite::checkPointIn(const CIwVec2&, CIwVec2)' bool checkPointIn(const CIwVec2& globalPoint, CIwVec2& localPoint) { return false; };
Selon la norme C ++, vous ne pouvez pas lier une valeur rvalue à une référence non const. Le compilateur Microsoft a cependant une extension maléfique qui le permet. Donc, g ++ est correct pour ne pas accepter votre programme.
g ++ a raison de se plaindre et Microsoft a ce problème. Le problème avec ce code est que la fonction checkPointIn prend son deuxième paramètre par référence, ce qui signifie qu’elle doit prendre une valeur lvalue (une variable ou un pointeur déréférencé, par exemple). Cependant, le code dans checkPointInside transmet un object temporaire, qui est une valeur rvalue. Pour des raisons historiques, le compilateur Microsoft le permet, bien que ce soit explicitement interdit par la spécification. Habituellement, si vous augmentez le niveau d’avertissement dans le compilateur Microsoft, le code sera effectivement signalé comme erroné.
Pour résoudre ce problème, demandez à checkPointIn de prendre son dernier argument par valeur ou par référence const. Ce dernier est probablement le meilleur choix, car les références const peuvent se lier à des valeurs si nécessaire et éviter de faire des copies coûteuses dans d’autres cas.
Vous ne pouvez pas créer de références à des temporaires (uniquement des références constantes ou des références de valeur r en C ++ 0x).
Cela se produit lorsque vous appelez checkPoint
avec CIwVec2()
tant que deuxième paramètre.