web-dev-qa-db-ja.com

to_stringはstdのメンバーではない、とg ++(mingw)は述べています。

私は言葉が意味のために私に無作為にフラッシュされるであろう小さな語彙記憶プログラムを作っています。 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フラグ何がおかしいのですか?

230
Anurag Kalia

これはMinGWの既知のバグです。 関連するBugzilla 。コメントセクションでは、MinGWで動作させるために patch を取得できます。

この問題は、 MinGW-w64プロジェクト によって提供されるGCC 4.8.0以上のMinGW-w64ディストリビューションで修正されています。名前にもかかわらず、プロジェクトは64ビットと32ビットのためのツールチェーンを提供します。 Nuwen MinGWディストリビューション もこの問題を解決します。

210
Rapptz
#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>を含めることを忘れないでください

112
cMinor

推奨されているように、これはあなたのコンパイラのバージョンに問題があるかもしれません。

次のコードを使用してlongstd::stringに変換してください。

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}
45
andre

この機能を使う.

    #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
20
Nirav Patel

to_stringはCygwinの現在の問題です

古いスレッドに対する新しい回答です。新しいものが登場しましたが、すぐに破棄されました 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 です。

12
user2603432

デフォルトの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でテスト済み

5
Joma

なぜこれがAndroidで起こるのか疑問に思う人は、おそらくあなたが間違ったC++標準ライブラリを使っているからです。 build.gradleのc ++ライブラリをgnustl_staticからc++_staticに、CMakeLists.txtのc ++標準を-std=gnu++11から-std=c++11に変更してみてください。

2
kynnysmatto

実際のところ、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関数が使用されていない限り)。

2
FrankHB

以下のように(上記のように)テンプレートライトソリューションを使用すると、

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.

1
Boris

to_string()はc ++ 11にのみ存在するので、c ++バージョンが少ない場合は sprintf または ostringstream などの代替メソッドを使用してください。

1

コードブロック内で、設定 - >コンパイラ設定 - >コンパイラフラグ - > std c ++ 11 doneに進みます。私は同じ問題を抱えていた...今それは働いています!

0
ShifaT