to_stringはstdのメンバーではない、とg ++は言う(mingw)


245

私は単語が意味のためにランダムに私にフラッシュされるだろう小さな語彙記憶プログラムを作っています。Bjarne Stroustroupが教えてくれたように、標準のC ++ライブラリを使用したいのですが、一見奇妙な問題がすぐに発生しました。

ファイルに格納できるようにlong整数をに変更したいstd::string。私はto_string()同じものを採用しています。問題は、g ++(--compileversionフラグで言及されているバージョン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フラグを使用してオンにできることを示しているため、そうなる可能性はありません。何が悪いのですか?


5
私のGCC 4.4.5で動作します(つまり、「あいまいなオーバーロード」エラーが発生します)。多分あなたlibstdc++は時代遅れですか?
Fred Foo、

3
それはIdeone上で動作 GCC 4.5.1を使用しています、。
Kerrek SB 2012

5
これは、g ++ 4.6.3で動作します。あなたのエラーは11行目を参照しています。あなたのプログラムはあなたのコードを「本質的に減らした」と言いますが、あなたが投稿したコードもそのエラーを与えますか?
Vaughn Cato、2012年

@ VaughnCato-うん、これは正確なプログラムです。わかりやすくするために編集する必要があります。さらに、私がそこで行っているそのstray intは何ですか?
Anurag Kalia 2012年

2
GCC 5.3.1を使用していますが、これも機能しません。ただし、それを修正するのは、後のC ++標準を使用するだけ-std=c++11です。つまり、フラグ以上でコンパイルします。
Arturo don Juan

回答:


212

これはMinGWの既知のバグです。関連するBugzilla。コメントセクションでは、MinGWで動作するようにパッチを入手できます。

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


2
ここでさらに議論:stackoverflow.com/questions/8542221/...
ベン

11
MinGW-w64バージョン4.8.1を使用していますが、機能しません。質問から正確なプログラムをコピーしました。それでも「to_string」は「std」エラーのメンバーではありません。私はそれをコンパイルしました:g ++ -std = c ++ 0x -o
tostring_test.exe tostring_test.cpp

5
@ zam664理由は説明できませんが、MinGWビルドを通じてMinGWstd::to_string 4.8.1(具体的にはx32-4.8.1-posix-dwarf-rev5インストールして作業する必要がありました。対照的に、「mingw-get」インストーラーまたはTDM-GCCパッケージのいずれかを介してインストールされたMinGW 4.8.1 では機能to_stringませんでした
セラン14

5
パッチは私にとって十分ではなかった、ここで説明さ#define _GLIBCXX_USE_C99 1C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hているように私はしなければならなかっ
Zook

3
@Cerran "MinGW-builds"は、MinGWとは別のプロジェクトであるMinGW-w64のビルドです。MinGW-w64がフォークされた1つの理由は、MinGW-w64が実際にこのスレッドのようなバグを修正できるようにするためでした。
MM

116
#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>


stodも含める方法はありますか?
ジャッキー

他のソースファイルから関数を呼び出します:patch :: to_string(errorCode)(errorCodeはintです)。コンパイラはその行でエラーを表示します。エラーは次のとおりです。`std:: string patch :: to_string <int>(int&) 'への未定義参照。何が悪いのかを理解しようとしています。
Nikos

1
これは、末尾のゼロに関する正確な解決策ではないことに注意してください。オリジナルstd::to_string(0.75)は通常"0.750000"、デフォルトのsprintf%dフォーマットを返し"0.75"ますが、これはを返します。理由についてはこちらをご覧ください:stackoverflow.com/a/13686914/785171
クシシュトフBociurko

47

提案されているように、これはコンパイラのバージョンの問題である可能性があります。

次のコードを使用してa 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;
}

私はそれを実行していませんが、私の差し迫ったジレンマを解決してくれてありがとう。今、私はそれがどのように機能するかを理解する必要があります。:)
Anurag Kalia 2012年

が必要な場合はstd::string.str()代わりに使用したいことに注意してください。
クリスチャンマン

1
これは、末尾のゼロに関する正確な解決策ではないことに注意してください。オリジナルstd::to_string(0.75)は通常"0.750000"(デフォルトのsprintf%d形式)を返し"0.75"ますが、これはを返します。理由についてはこちらをご覧ください:stackoverflow.com/a/13686914/785171
クシシュトフBociurko

20

この機能を使用...

    #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

2
コードがどれほど簡単に理解できるかに関係なく、いくつかの説明(少なくともコメント)を回答に追加してください。
vefthym 2014年

4
回避策を
講じる

「標準」の方法(std :: to_string)は、機能しない場合を除いて、多くの場合機能します。sstreamは「標準」の回避策です。
Nick Vence 2014年

これは、末尾のゼロに関する正確な解決策ではないことに注意してください。オリジナルstd::to_string(0.75)は通常"0.750000"(デフォルトのsprintf%d形式)を返し"0.75"ますが、これはを返します。理由についてはこちらをご覧ください:stackoverflow.com/a/13686914/785171
クシシュトフBociurko

12

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は、

...ある時点で「長い二重」機能をnewlibに組み込むことをまだ望んでいます。

2015年10月25日、Corrineはまた

数学の知識が少しある誰かが、不足している長いdouble関数をnewlibに提供してくれればなお良いでしょう。

だから、それがあります。たぶん、知識と時間を持っている私たちの1人が、貢献してヒーローになることができます。

Newlibはこちらです。


今年だけパッチをメールでgitに送信することから彼らがどのように移行したかを見ると、それは
思いがけないこと

8

デフォルトのC ++標準を変更する

(COMPILEの失敗したファイル)のエラー:「TO_STRING」「STD」のメンバではありません

-std = c ++ 98

(COMPILEファイルSUCCESSFUL)

-std = c ++ 11または-std = c ++ 14

Cygwin G ++(GCC)5.4.0でテスト済み



2

事実は、libstdc ++が実際std::to_stringに* -w64-mingw32ターゲットで4.8.0以降サポートされていることです。ただし、これには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

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


1

次のようなtemplate-light-solution(上記を参照)を使用する場合:

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

残念ながら、場合によっては問題が発生します。たとえば、静的なconstメンバーの場合:

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。


0

コードブロックでは、設定->コンパイラ設定->コンパイラフラグ-> select std c ++ 11 doneに移動します。私は同じ問題を抱えていました...今はうまくいきます!


-4

これは私にも起こりました。コンパイラの更新について心配するのではなく、クイック関数を記述しただけです。

string to_string(int number){
    string number_string = "";
    char ones_char;
    int ones = 0;
    while(true){
        ones = number % 10;
        switch(ones){
            case 0: ones_char = '0'; break;
            case 1: ones_char = '1'; break;
            case 2: ones_char = '2'; break;
            case 3: ones_char = '3'; break;
            case 4: ones_char = '4'; break;
            case 5: ones_char = '5'; break;
            case 6: ones_char = '6'; break;
            case 7: ones_char = '7'; break;
            case 8: ones_char = '8'; break;
            case 9: ones_char = '9'; break;
            default : ErrorHandling("Trouble converting number to string.");
        }
        number -= ones;
        number_string = ones_char + number_string;
        if(number == 0){
            break;
        }
        number = number/10;
    }
    return number_string;
}

29
これはstd :: to_stringの代替ではなく、質問への答えでもありません。
Verax

13
std :: coutも実装することを忘れないでください!根本的な問題を理解するよりも、多くの追加のバグを再実装するだけの方がはるかに優れています。
jmc 2015

あなたは物事を複雑にしています。Justones_char = '0' + number % 10;
phuclv 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.