J'utilise actuellement Visual Studio Community 2017. En examinant les normes de langage C++ dans les propriétés du projet, elles ne fournissent que C++ 14 et C++ 17. Étant donné que mon code a été terminé pour une affectation précédente à l'aide d'un compilateur pour C++ 11, je ne peux pas exécuter mon code à l'aide de fonctions telles que stoi. Ma question est de savoir s'il existe un moyen d'ajouter C++ 11 aux normes de langage pour C++?
Je crée un DLL pour une interface graphique, mes initialisations sont:
#include <string>
#include "stdafx.h"
using namespace std;
Ici, je crée une classe de fraction, les principales erreurs suivent dans l'ifstream:
istream& operator>>(istream& in, Fraction& f) {
string number;
in >> number; //read the number
size_t delimiter = number.find("/"); //find the delimiter in the string "/"
if (delimiter != string::npos) { //if delimiter is not empty
int n = stoi(number.substr(0, delimiter)); //set numerator from string to integer before the "/"
int d = stoi(number.substr(delimiter + 1)); //set denominator from string to integer after the "/"
if (d == 0) { //if denominator is 0
throw FractionException("Illegal denominator, cannot divide by zero."); //illegal argument throw
}
else if (n == 0 && d != 0) { //numerator is 0, then set values as zero fraction
f.numVal = 0;
f.denVal = 1;
}
else { //set the values into the fraction and normalize and reduce fraction to minimum
f.numVal = n;
f.denVal = d;
f.normalizeAndReduce(f.numVal, f.denVal);
}
}
else { //else if there is no delimiter it would be a single integer
f.numVal = stoi(number);
f.denVal = 1;
}
return in;
}
Je reçois les erreurs suivantes:
C2679: binary '>>': no operator found which takes a right-hand operator of type 'std::string"
C3861: 'stoi' identifier not found
Cette méthode a parfaitement fonctionné dans Eclipse, je ne sais pas ce que je fais mal.
Le compilateur Visual C++ 2017 est compatible C++ 11/C++ 14 avec quelques exceptions spécifiques:
Le compilateur n'offre pas de mode C++ 11 spécifique et utilise par défaut C++ 14, mais cette norme inclut entièrement C++ 11. La prise en charge de C++ 17 est en cours et nécessite que vous utilisiez / std: c ++ 17 ou /std::c++latest
commutateur.
std::stoi
vous oblige à inclure l'en-tête approprié, en particulier <string>>
Soit vous avez oublié d'inclure cet en-tête, soit vous n'avez pas traité la résolution namespace
(soit explicitement comme std::
ou via using namespace std;
)
Voir Caractéristiques C++ 17 et correctifs STL dans VS 2017 15. pour le dernier état de conformité aux normes C++ 11/C++ 14/C++ 17 à partir de VS 2017 (mise à jour 15.3)
MISE À JOUR: Maintenant que vous avez publié votre code, je vois que le problème a rien à voir avec quelle norme est prise en charge. Votre problème est que vous ne connaissez pas les secrets du fonctionnement des en-têtes précompilés.
Changement:
#include <string>
#include "stdafx.h"
à:
#include "stdafx.h"
#include <string>
-ou- ajoutez #include <string>
à l'en-tête précompilé stdafx.h
directement.
Microsoft, je pense, a déclaré que
Notez qu'il n'est pas prévu d'ajouter un commutateur C++ 11. lien
Il n'y a donc pas de commutateur explicite
En tant que mise à jour, VS 2017, la mise à jour 9.4 (publiée en décembre 2018) est désormais entièrement compatible C++ 17.