web-dev-qa-db-ja.com

C ++ 11はVisual Studio 2017で使用できますか?

現在、Visual Studio Community 2017を使用しています。プロジェクトプロパティのC++言語標準を見ると、C++ 14とC++ 17のみが提供されています。私のコードはC++ 11のコンパイラを使用して以前の割り当てで完成したため、stoiなどの関数を使用してコードを実行することはできません。私の質問は、C++ 11をC++の言語標準に追加する方法があるかどうかです。

GUIの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で完璧に機能しましたが、私が何を間違っているのかはわかりません。

12
user3344484

Visual C++ 2017コンパイラは、いくつかの特定の例外を除き、C++ 11/C++ 14に準拠しています。

  • Expression SFINAE は実装されていますが、完全ではありません。
  • 可変長マクロに関するいくつかのバグのため、完全なC99プリプロセッササポートは制限されています。
  • 2段階の名前検索は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;経由)

VS 2017(15.3更新)時点でのC++ 11/C++ 14/C++ 17標準準拠の最新の状況については、 VS 2017 15.3のC++ 17機能とSTL修正 を参照してください

UPDATED:これでコードを投稿したので、問題にはnothingと関係があることがわかりますどの標準がサポートされています。あなたの問題は、プリコンパイル済みヘッダーがどのように機能するかの秘密を知らないことです。

変化する:

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

に:

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

-または-#include <string>をプリコンパイル済みヘッダーstdafx.hに直接追加します。

プリコンパイル済みヘッダーファイルの作成 を参照してください

25
Chuck Walbourn

マイクロソフトはそれを宣言したと思う

C++ 11スイッチを追加する予定はないことに注意してください。 リンク

したがって、明示的なスイッチはありません

1
AliReza

これに対する更新として、VS 2017、Update 9.4(2018年12月リリース)はC++ 17に完全に準拠しています。

0
Mike Diack