Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is C++11 available in Visual Studio 2017?

I am currently using Visual Studio Community 2017. From looking at the C++ Language Standards in the project properties, they only provide C++14 and C++17. Since my code was completed for a previous assignment using a compiler for C++11, I am unable to run my code using functions such as stoi. My question is if there is a way to add C++11 to the language standards for C++?

I am creating a DLL for a GUI, my initializations are:

#include <string>
#include "stdafx.h"

using namespace std;

Here I am creating a fraction class, the main errors follow in the 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;
}

I am getting the following errors:

C2679: binary '>>': no operator found which takes a right-hand operator of type 'std::string"
C3861: 'stoi' identifier not found

This method worked perfectly fine in eclipse, not sure what I am doing wrong.

like image 537
user3344484 Avatar asked Oct 31 '17 20:10

user3344484


People also ask

What version of C does Visual Studio use?

In versions of Visual Studio 2019 before version 16.11, /std:c++latest is required to enable all the compiler and standard library features of C++20. For a list of supported language and library features, see What's New for C++ in Visual Studio.

Is Visual Studio 2017 still supported?

Visual Studio 2017: mainstream support ends April 12, 2022, and the product will transition to extended support until April 2027. During extended support we'll provide fixes only for security issues. We recommend users move to the 15.9 supported baseline to remain under support.

What version of C++ is in Visual Studio 2017?

Visual Studio 2017 version 15.3/std:c++17 enables the set of C++17 features implemented by the compiler.


2 Answers

The Visual C++ 2017 compiler is C++11/C++14 compliant with a few specific exceptions:

  • Expression SFINAE is implemented, but not complete. (Now complete in VS 2017 (15.7))
  • Full C99 preprocessor support is limited due to some bugs with variadic macros
  • Two phase name lookup is in VS 2017 (15.3 update) but is incomplete and only active when using /permissive- (Now complete in VS 2017 (15.7))

The compiler does not offer a specific C++11 mode and defaults to C++14, but that standard is fully inclusive of C++11. C++17 support is in progress, and requires you use the /std:c++17 or /std::c++latest switch.

std::stoi requires you include the appropriate header, specifically <string>> Either you forgot to include that header -or- you didn't deal with the namespace resolution (either explicitly as std:: or via using namespace std;)

See C++17 Features And STL Fixes In VS 2017 15.3 for the latest status of C++11/C++14/C++17 standards conformance as of the VS 2017 (15.3 update)

UPDATED: For the latest on Visual C++ conformance, see Microsoft Docs.

Now that you have posted your code, I see that the problem has nothing to do with which standard is supported. Your problem is that you don't know the secrets of how Precompiled Headers work.

Change:

#include <string>
#include "stdafx.h"

to:

#include "stdafx.h"
#include <string>

-or- add #include <string> to the precompiled header stdafx.h directly.

See Creating Precompiled Header Files

like image 131
Chuck Walbourn Avatar answered Sep 20 '22 09:09

Chuck Walbourn


Microsoft I think has declared that

Note that there is no plan to add a C++11 switch. link

So there's not an explicit switch

like image 25
AliReza Avatar answered Sep 19 '22 09:09

AliReza