В настоящее время я использую Visual Studio Community 2017. Изучая Стандарты языка C ++ в свойствах проекта, они предоставляют только C ++ 14 и C ++ 17. Поскольку мой код был завершен для предыдущего назначения с использованием компилятора для C ++ 11, я не могу запустить свой код, используя такие функции, как Stoi. У меня вопрос, есть ли способ добавить C ++ 11 в стандарты языка для C ++?

Я создаю 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

Этот метод отлично работал в затмении, не уверен, что я делаю неправильно.

16
user3344484 31 Окт 2017 в 23:17

4 ответа

Лучший ответ

Компилятор Visual C ++ 2017 совместим с C ++ 11 / C ++ 14 с некоторыми конкретными исключениями:

  • Выражение SFINAE реализовано, но не завершено.
  • Полная поддержка препроцессора C99 ограничена из-за некоторых ошибок с переменными макросами
  • Двухфазный поиск имени в VS 2017 (обновление 15.3), но неполная и активна только при использовании / permissive-

Компилятор не предлагает определенного режима C ++ 11 и по умолчанию - C ++ 14, но этот стандарт полностью включает C ++ 11. Поддержка C ++ 17 находится в стадии разработки и требует использования / переключатель std: c ++ 17 или /std::c++latest.

std::stoi требует, чтобы вы включили соответствующий заголовок, в частности <string>> Либо вы забыли включить этот заголовок, либо вы не имели дело с разрешением namespace (либо явно как std:: или через using namespace std;)

См. Возможности C ++ 17 и исправления STL в VS 2017 15.3 для последнего статуса соответствия стандартам C ++ 11 / C ++ 14 / C ++ 17 на VS 2017 (обновление 15.3)

ОБНОВЛЕНО . Теперь, когда вы опубликовали свой код, я вижу, что проблема не связана с тем, какой стандарт поддерживается. Ваша проблема в том, что вы не знаете секретов работы Precompiled Headers.

Изменить:

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

Чтобы :

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

-или- добавить #include <string> непосредственно в предварительно скомпилированный заголовок stdafx.h.

См. создание предварительно скомпилированных файлов заголовков

27
Chuck Walbourn 31 Окт 2017 в 20:55

C ++ является развивающимся стандартом - после 2003 года был 2011 (C ++ 11), затем 2014 (C ++ 14), и теперь у нас есть 2017 (C ++ 17), и мы работаем над 2020 годом (C ++ 20). Они совместимы вверх.

Посмотрите здесь для поддержки Microsoft Visual C ++ для различных стандарты .

-7
davidbak 31 Окт 2017 в 20:23

Я думаю, что Microsoft заявила, что

Обратите внимание, что не планируется добавлять переключатель C ++ 11. ссылка

Так что нет явного переключения

3
AliReza 29 Июл 2019 в 10:00

В качестве обновления к этому, VS 2017, обновление 9.4 (выпуск декабрь 2018) теперь полностью совместимо с C ++ 17.

0
Mike Diack 28 Фев 2019 в 13:43