Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Samuel Proulx le Juin 04, 2012, 06:07:04 am

Titre: packet : erreur d'extraction d'une enum -> plantage
Posté par: Samuel Proulx 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 :)
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Laurent 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.
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Samuel Proulx 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...
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Laurent 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.
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Samuel Proulx 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 <<.
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Samuel Proulx 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.
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Laurent 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;
}
Titre: Re : packet : erreur d'extraction d'une enum -> plantage
Posté par: Samuel Proulx 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 ! :)