-
Bonjour à tous et à toutes :)
Ce code ne fonctionne pas chez moi :
enum NetDataType
{
Error,
Done
};
EncryptedPacket : public Packet
{
};
EncryptedPacket& operator <<(EncryptedPacket& packet,const NetDataType& d)
{
packet << d;
}
main()
{
EncryptedPacket packet;
NetDataType data;
data = Error;
packet << data;
}
Petites explications : Si je ne mets pas l'operator<<, on me dit que l'operator << n'est pas surchargé pour les NetDataType. J'ai donc fait ceci, mais ça crée une boucle infini. J'ai changé packet << d pour packet << static_cast<int>(d) et pu de problème. Seulement, lorsque j'arrive avec l'operator >>, je ne peux pas faire ça parce que ça dit qu'il y a ambiguïté avec l'operator >> int de Packet...
J'ai donc aucune solution pour mettre des enums dans les packet...
Merci et bonne journée :)
-
Les paquets acceptent les types à taille fixe, pas les types natifs. Donc par exemple il faut utiliser sf::Uint8 au lieu de int.
-
Donc tu veux dire que je dois remplacer dans ma struct mon Data.dataType (NetDataType) par (sf::Uint8) ? Sauf que là ça ôte tout l'intérêt d'avoir une enum...
-
Non, je dis juste que quand tu l'encodes/décodes dans un paquet il faut le convertir en sf::Uint8. Comme ce que tu as essayé de faire, mais avec sf::Uint8 à la place de int.
-
Mais ça me fait la même erreur : il y a ambiguïté pour l'opérateur packet >> Uint8... comme si j’essayais de le surcharger de la classe Packet...
EncryptedPacket& operator>>(EncryptedPacket& packet,Data& d)
{
packet >> static_cast<Uint8>(d.dataType) >> d.data;
return packet;
}
ambiguous overload for 'operator>>' in 'packet >> (sf::Uint8)d->Data::dataType'
Ça me met cette erreur seulement pour >> et non pour <<.
-
Si d.dataType = sf::Uint8 : la même méthode >> sans le cast me dit que la structure NetDataType n'est pas surchargé avec l'opérateur >> et si je fais une surcharge, dedans on va mettre packet >> static_cast<Uint8>(NetDataType) et on revient à la case départ.
-
L'opérateur >> attend une référence non-constante, donc tu ne peux pas lui filer le résultat d'un cast, qui est une variable temporaire non nommée.
Il faut le faire ainsi :
EncryptedPacket& operator>>(EncryptedPacket& packet,Data& d)
{
Uint8 t;
packet >> t >> d.data;
d.dataType = static_cast<NetDataType>(t);
return packet;
}
-
Ah ! Merci beaucoup ! Ça fonctionne maintenant :) Effectivement, je trouvais aussi bizarre de filer un static_cast<x>(y); à un opérateur >> (instinctivement), mais je n'avais pas pensé utiliser une variable temporaire.
Merci encore une fois ( ;D) et bonne journée ! :)