Доступен ли С++ 11 в Visual Studio 2017?
В настоящее время я использую Visual Studio Community 2017. Изучая стандарты языка С++ в свойствах проекта, они предоставляют только С++ 14 и С++ 17. Поскольку мой код был выполнен для предыдущего назначения с использованием компилятора для С++ 11, я не могу запустить свой код с помощью таких функций, как stoi. Мой вопрос в том, есть ли способ добавить С++ 11 в языковые стандарты для С++?
Я создаю DLL для графического интерфейса, мои инициализации:
#include <string>
#include "stdafx.h"
using namespace std;
Здесь я создаю класс фракции, основные ошибки следуют в 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;
}
Я получаю следующие ошибки:
C2679: binary '>>': no operator found which takes a right-hand operator of type 'std::string"
C3861: 'stoi' identifier not found
Этот метод отлично работал в eclipse, не уверен, что я делаю неправильно.
Ответы
Ответ 1
Компилятор Visual С++ 2017 - это С++ 11/С++ 14, совместимый с несколькими конкретными исключениями:
- Выражение SFINAE реализовано, но не завершено.
- Полная поддержка препроцессора C99 ограничена из-за некоторых ошибок с переменными макросами
- Поиск по двум фазам в VS 2017 (обновление 15.3), но неполный и активен только при использовании /permissive-
Компилятор не предлагает определенный режим С++ 11 и по умолчанию использует С++ 14, но этот стандарт полностью включает С++ 11. Поддерживается поддержка С++ 17 и требуется использовать переключатель /std: С++ 17 или /std::c++latest
.
std::stoi
требует включения соответствующего заголовка, в частности <string>>
Или вы забыли включить этот заголовок - или - вы не имели дело с разрешением namespace
(либо явно, как std::
, либо через using namespace std;
)
См. С++ 17 Особенности и исправления STL В VS 2017 15.3 для получения последнего статуса С++ 11/С++ 14/С++ 17 с VS 2017 (обновление 15.3)
ОБНОВЛЕНО: Теперь, когда вы разместили свой код, я вижу, что проблема не имеет никакого отношения к тому, какой стандарт поддерживается. Ваша проблема в том, что вы не знаете секретов работы Precompiled Headers.
Изменить:
#include <string>
#include "stdafx.h"
в
#include "stdafx.h"
#include <string>
-or- добавить #include <string>
в предварительно скомпилированный заголовок stdafx.h
.
См. Создание предварительно скомпилированных файлов заголовков
Ответ 2
Я думаю, что Microsoft заявила, что
Обратите внимание, что не планируется добавлять переключатель С++ 11. ссылка
Так что там не явный переключатель
Ответ 3
В качестве обновления к этому, VS 2017, обновление 9.4 (выпуск декабрь 2018) теперь полностью совместимо с С++ 17.
Ответ 4
С++ - это эволюционирующий стандарт - после 2003 года был 2011 (С++ 11), затем 2014 (С++ 14), и теперь у нас есть 2017 (С++ 17), и мы работаем в направлении 2020 года (С++ 20). Они совместимы с восходящей.
Посмотрите здесь для поддержки Microsoft Visual С++ для различных стандартов.