Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: packet : erreur d'extraction d'une enum -> plantage  (Lu 3674 fois)

0 Membres et 1 Invité sur ce sujet

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
packet : erreur d'extraction d'une enum -> plantage
« le: Juin 04, 2012, 06:07:04 am »
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 :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #1 le: Juin 04, 2012, 08:21:39 am »
Les paquets acceptent les types à taille fixe, pas les types natifs. Donc par exemple il faut utiliser sf::Uint8 au lieu de int.
Laurent Gomila - SFML developer

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #2 le: Juin 04, 2012, 01:14:00 pm »
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...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #3 le: Juin 04, 2012, 01:39:52 pm »
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.
Laurent Gomila - SFML developer

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #4 le: Juin 04, 2012, 02:03:30 pm »
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 <<.

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #5 le: Juin 04, 2012, 02:04:53 pm »
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.
« Modifié: Juin 04, 2012, 02:14:43 pm par neo007 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #6 le: Juin 04, 2012, 02:14:49 pm »
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;
}
Laurent Gomila - SFML developer

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : packet : erreur d'extraction d'une enum -> plantage
« Réponse #7 le: Juin 04, 2012, 02:21:07 pm »
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 ! :)