私は言葉が意味のために私に無作為にフラッシュされるであろう小さな語彙記憶プログラムを作っています。 Bjarne Stroustroupが言っているように、私は標準C++ライブラリを使いたいのですが、戸外で一見奇妙な問題に遭遇しました。
ファイルに格納できるように、long
整数をstd::string
に変更したいです。私は同じようにto_string()
を使っています。問題は、私がg ++( - flagversionフラグで言及されているようにバージョン4.7.0)でそれをコンパイルするとき、それは言います:
PS C:\Users\Anurag\SkyDrive\College\Programs> g++ -std=c++0x ttd.cpp
ttd.cpp: In function 'int main()':
ttd.cpp:11:2: error: 'to_string' is not a member of 'std'
このエラーを表示する私のプログラムは次のとおりです。
#include <string>
int main()
{
std::to_string(0);
return 0;
}
しかし、私はそれがmsdnライブラリ 明らかに言う それが存在していてStack Overflow上の 以前の質問 _(g ++バージョン4.5用)でそれが有効にできると言っているからではない-std=c++0x
フラグ何がおかしいのですか?
これはMinGWの既知のバグです。 関連するBugzilla 。コメントセクションでは、MinGWで動作させるために patch を取得できます。
この問題は、 MinGW-w64プロジェクト によって提供されるGCC 4.8.0以上のMinGW-w64ディストリビューションで修正されています。名前にもかかわらず、プロジェクトは64ビットと32ビットのためのツールチェーンを提供します。 Nuwen MinGWディストリビューション もこの問題を解決します。
#include <string>
#include <sstream>
namespace patch
{
template < typename T > std::string to_string( const T& n )
{
std::ostringstream stm ;
stm << n ;
return stm.str() ;
}
}
#include <iostream>
int main()
{
std::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ;
}
#include <sstream>
を含めることを忘れないでください
推奨されているように、これはあなたのコンパイラのバージョンに問題があるかもしれません。
次のコードを使用してlong
をstd::string
に変換してください。
#include <sstream>
#include <string>
#include <iostream>
int main() {
std::ostringstream ss;
long num = 123456;
ss << num;
std::cout << ss.str() << std::endl;
}
この機能を使う.
#include<sstream>
template <typename T>
std::string to_string(T value)
{
//create an output string stream
std::ostringstream os ;
//throw the value into the string stream
os << value ;
//convert the string stream into a string and return
return os.str() ;
}
//you can also do this
//std::string output;
//os >> output; //throw whats in the string stream into the string
古いスレッドに対する新しい回答です。新しいものが登場しましたが、すぐに破棄されました Cygwin:g ++ 5.2:「to_string」は「std」のメンバーではありません 。
残念なことに、更新された答えが得られたかもしれません。 @Alexによると、Cygwin g ++ 5.2は2015年11月3日の時点でまだ機能していません。
2015年1月16日、Red HatのCygwinメンテナーであるCorinna Vinschen 問題を言った はnewlibの欠点でした。ほとんどのlong double関数をサポートしていないため、C99に対応していません。
Red Hatは、
...ある時点で、「long double」機能をnewlibに追加することを望んでいます。
2015年10月25日 Corrineも言いました 、
数学の知識が少しでもある人が、欠落しているlong double関数をnewlibに提供してくれたら、それでもいいでしょう。
そこにあります。知識と時間を持っている私たちの一人が、貢献してヒーローになれるかもしれません。
Newlibは here です。
デフォルトのC++標準を変更する
From (COMPILE FILE FAILED)エラー: 'to_string'は 'std'のメンバーではありません
-std = c ++ 98
から (COMPILE FILE SUCCESSFUL)
-std = c ++ 11または-std = c ++ 14
Cygwin G ++(GCC)5.4.0でテスト済み
なぜこれがAndroidで起こるのか疑問に思う人は、おそらくあなたが間違ったC++標準ライブラリを使っているからです。 build.gradleのc ++ライブラリをgnustl_static
からc++_static
に、CMakeLists.txtのc ++標準を-std=gnu++11
から-std=c++11
に変更してみてください。
実際のところ、libstdc ++は* -w64-mingw32ターゲット 4.8.0以降 でstd::to_string
を実際にサポートしています。ただし、これにはMinGW.org、Cygwin、およびその変種(MSYS2の* -pc-msysなど)のサポートは含まれていません。 https://cygwin.com/ml/cygwin/2015-01/msg00245.html も参照してください。
MinGW-w64でバグが解決する前に 回避策 を実装しました。他の答えのコードとは異なるので、これは(可能な限り)libstdc ++の模倣です。文字列ストリームの構築は不要ですが、libstdc ++の拡張機能に依存します。今でも私はWindows上でmingw-w64ターゲットを使用していますが、それは他の複数のターゲットに対してはうまく機能します(long double
関数が使用されていない限り)。
以下のように(上記のように)テンプレートライトソリューションを使用すると、
namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}
残念ながら、場合によっては問題が発生します。たとえば、 static const membersの場合、
hpp
class A
{
public:
static const std::size_t x = 10;
A();
};
cpp
A::A()
{
std::cout << std::to_string(x);
}
そしてリンク:
CMakeFiles/untitled2.dir/a.cpp.o:a.cpp:(.rdata$.refptr._ZN1A1xE[.refptr._ZN1A1xE]+0x0): undefined reference to `A::x'
collect2: error: ld returned 1 exit status
これを解決する1つの方法があります( size_t 型に追加)
namespace std {
std::string to_string(size_t n) {
std::ostringstream s;
s << n;
return s.str();
}
}
HTH.
to_string()はc ++ 11にのみ存在するので、c ++バージョンが少ない場合は sprintf または ostringstream などの代替メソッドを使用してください。
コードブロック内で、設定 - >コンパイラ設定 - >コンパイラフラグ - > std c ++ 11 doneに進みます。私は同じ問題を抱えていた...今それは働いています!