Erreur de compilation C4244: ‘initialisation’: conversion de ‘__int64’ en ‘int’, perte possible de données

J’essaie d’utiliser std :: cound sur std :: vector comme suit.

int count = std::count( stdVector.begin(), stdVector.end(), "element" ); 

Sur Windows, il donne l’erreur de compilation suivante.

error C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data

Si je change le code comme suit, le compilateur Windows n’apparaît pas.

 auto count = std::count( stdVector.begin(), stdVector.end(), "element" ); 

Cependant, je suis confronté à l’erreur suivante sur Linux pour le changement ci-dessus.

error: ISO C++ forbids declaration of 'count' with no type

Comment utiliser std::count qui sera généré sur la plate-forme sans aucune erreur?

Il y a deux choses qui peuvent être différentes dans des environnements différents:

Le premier est auto car un type déduit est une fonctionnalité C ++ 11. Peut-être que le compilateur Linux ne l’a pas par défaut (utilisez simplement -std=c++11 , et si ce n’est pas le cas, -std=c++11 jour!)

L’autre est que le type de retour de std :: count est size_t , not int , et size_t à int peut perdre des données en fonction de la size_t (il existe au moins une incompatibilité signée / non signée et éventuellement une taille différente de les deux types, comme 32 bits pour int et 64 bits pour size_t ).

La raison pour laquelle vous obtenez cet avertissement est que, sur une version 64 bits, les conteneurs standard utilisent des valeurs de 64 bits pour les types de taille et la conversion implicite d’une valeur de 64 bits (par exemple size_t ) en 32 bits (par exemple int ) peut size_t une perte de données.

Le type de données réel renvoyé par la fonction count , qui dans ce cas serait std::vector::difference_type , est probablement le meilleur type à utiliser si votre compilateur ne prend pas en charge auto . L’utilisation de size_t fonctionnerait probablement aussi sans avertissement, et est beaucoup plus courte à taper.

Sinon, si vous n’êtes pas dérangé par le risque de perte de données (par exemple, ne jamais prévoir d’avoir plus de 2 ^ 32-1 objects dans le conteneur), vous pouvez simplement rejeter l’avertissement:

 int count = static_cast( std::count(stdVector.begin(), stdVector.end(), "element") );