web-dev-qa-db-ja.com

std :: stoiはMinGWのg ++​​ 4.6.1には存在しません

私はこの単純なプログラムをコンパイルしてみました IdeOneで (gcc 4.5.1を使用)とLinuxコンピューター(4.6.4のようなものを使用)で:

#include <string>
#include <iostream>

int main() {
     std::cout << std::stoi("32") << std::endl;
}

そして、それは完全にコンパイルされ、32を出力します。ただし、MinGWとgcc 4.6.1を使用してWindowsコンピューターでコンパイルしようとすると、次のエラーが発生します。

test.cpp: In function 'int main()':
test.cpp:5:19: error: 'stoi' is not a member of 'std'

同じことがstd::stoulなどでも発生します。std::stoiおよびファミリは、何らかの理由でMinGWに存在しませんか? MinGW(sh | w)のgccはLinuxと同じように動作すると思いました。

32
Seth Carnegie

これは、Windowsでのvswprintfの非標準宣言の結果です。 GNU標準ライブラリは、このプラットフォームで__GLIBCXX_HAVE_BROKEN_VSWPRINTF_を定義します。これにより、使用しようとしている変換関数が無効になります。この問題とマクロの詳細については、こちらをご覧ください:- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522

MinGWと共に配布されたヘッダーファイルを変更する場合は、_.../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h_の2754行目の!defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)マクロを削除し、2905行目に再度追加することで回避できます。 2965(_std::vswprintf_を参照する行)。 _std::to_wstring_関数を使用することはできませんが、他の変換関数の多くは使用できるはずです。

45
DRH

これは MinGW-w64 で修正されています。元のMinGWプロジェクトのフォークで、実際にこのようなバグの修正に関心があります。それはg ++ 4.9.2の時点で、そしておそらく以前に修正されました。


注:CodeBlocks(古い、壊れたMinGWに付属)のデフォルトインストールを行っており、コンパイラをアップグレードしたい人のために この回答を参照してください

MinGW-w64の任意のビルドを使用できます。私はmingw-builds.orgのセルフインストーラーを使用していますが、その回答ではTDM-GCC-64を使用しています。 64ビットと32ビットの両方のコンパイルが必要な場合は、2つの新しいコンパイラ(mingw-w64 64ビットとmingw-w64 32ビット)をインストールして追加する必要があります。 -m32または-m64スイッチを切り替えて、g ++の1つのインストールを使用することはサポートしていません。

4
M.M

Mingw-w64を使用します。これと同じ問題があり、Mingw-w64を使用するとうまくいきました。

0
Sean Nolan

MinGW 4.9.3-1を使用しています。この問題はまだ残っているようです。回避策として、文字列から整数を取得する別の方法を使用しました。

int rows, columns;
sscanf(argv[1], "%d", &rows);
sscanf(argv[2], "%d", &columns);
0
ashish