web-dev-qa-db-fra.com

C ++ 11 est-il disponible dans Visual Studio 2017?

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.

12
user3344484

Le compilateur Visual C++ 2017 est compatible C++ 11/C++ 14 avec quelques exceptions spécifiques:

  • Expression SFINAE est implémenté, mais pas complet.
  • La prise en charge complète du préprocesseur C99 est limitée en raison de certains bogues avec les macros variadiques
  • La recherche de nom en deux phases est dans VS 2017 (mise à jour 15.3) mais est incomplète et uniquement active lors de l'utilisation / permissive -

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.

Voir Création de fichiers d'en-tête précompilés

25
Chuck Walbourn

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

1
AliReza

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.

0
Mike Diack