Pourquoi reinterpret_cast ne convertit-il pas le caractère ‘unsigned char’ en ‘char’?

J’essaie de comstackr cette bibliothèque en utilisant MSVC10, et cette fonction me donne mal à la tête:

/*! \brief Read bytes from a \c std::istream \param is The stream to be read. \param data A pointer to a location to store the bytes. \param size The number of bytes to be read. */ void _read(std::istream &is, unsigned char *data, int size) { for (int i=0; i < size ; ++i ) is.get(static_cast(data[i])); } 

erreur C2664: ‘std :: basic_istream & std :: basic_istream :: get (_Elem &)’: impossible de convertir le paramètre 1 de ‘char’ en ‘char &’

L’original utilisé static_cast, donc j’essaie avec reinterpret_cast comme suggéré ailleurs mais cela échoue aussi:

erreur C2440: ‘reinterpret_cast’: impossible de convertir le caractère ‘unsigned char’ en ‘char’

Cette bibliothèque est livrée avec des makefiles Unix. Quel est le meilleur moyen de résoudre cette erreur de compilation?

Parce que reinterpret_cast ne fonctionne pas de cette façon, par définition.

Pour pouvoir réinterpréter la mémoire, vous devez appliquer reinterpret_cast aux pointeurs ou aux références. Si vous souhaitez réinterpréter les données de caractère unsigned char tant que données de type char , vous devez en réalité convertir en caractères char & type, et non en caractères.

Dans votre cas, ce serait

 is.get(reinterpret_cast(data[i])); 

Ou vous pouvez aller sur la route du pointeur et faire

 is.get(*reinterpret_cast(&data[i])); 

(qui est la même chose).

Parce que vous avez besoin d’un caractère char& qu’il s’agit d’une référence à char mais que le résultat de la conversion est une valeur r, et ne peut donc pas être lié à la référence.

Vous avez besoin de quelque chose comme:

 is.get(reinterpret_cast(data[i])); 

Mais dans ce cas particulier, vous pouvez / static_cast utiliser static_cast :

 is.get(static_cast(data[i])); 

Essayez plutôt ceci:

 void _read(std::istream &is, unsigned char *data, int size) { for (int i=0; i < size ; ++i ) is.get(reinterpret_cast(data)[i]); } 

En plus des autres réponses au problème du casting:

Pourquoi n’utilisez-vous pas simplement istream::read pour lire les octets de size à la fois? Cela évite votre for-loop fabriqué à la main et devrait être plus rapide.

 void _read(std::istream &is, unsigned char *data, int size) { is.read(reinterpret_cast(data), size); }