263

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

long整数をstd::stringファイルに保存できるように変更したい。私は同じために採用to_string()しました。問題は、g++ ( --‍version フラグに記載されているバージョン 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 ライブラリはそれが存在すると明確に述べており、スタック オーバーフロー (g++ バージョン 4.5 の場合) に関する以前の質問-std=c++0xでは、フラグを使用してオンにできると述べているため、そうではないことはわかっています。私は何を間違っていますか?

4

13 に答える 13

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

于 2013-12-31T18:23:14.123 に答える
48

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

次のコードを使用して 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;
}
于 2012-10-19T14:03:31.760 に答える
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
于 2014-06-03T06:28:59.543 に答える
12

to_string は Cygwin の現在の問題です

これは、古いスレッドに対する新しい回答です。Cygwin: g++ 5.2: ' to_string ' is not a member of 'std'</a>.

残念ながら、更新された回答が得られたかもしれません。@Alex によると、2015 年 11 月 3 日現在、Cygwin g++ 5.2 はまだ動作していません。

2015 年 1 月 16 日、Red Hat の Cygwin メンテナーである Corinna Vinschen は、問題は newlib の欠点であると述べました。ほとんどの long double 関数をサポートしていないため、C99 に対応していません。

レッドハットは、

... ある時点で「long double」機能を newlib に入れることをまだ望んでいます。

2015 年 10 月 25 日、Corrine は次のようにも述べています。

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

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

Newlib はこちらです。

于 2015-11-26T04:49:24.847 に答える
3

次のような 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。

于 2016-02-17T00:13:31.807 に答える
2

実際のところ、 libstdc++ は4.8.0以降std::to_stringの *-w64-mingw32 ターゲットで実際にサポートされています。ただし、これには MinGW.org、Cygwin、およびバリアント (MSYS2 の *-pc-msys など) のサポートは含まれません。https://cygwin.com/ml/cygwin/2015-01/msg00245.htmlも参照してください。

MinGW-w64 のバグが解決される前に、回避策を実装しました。他の回答のコードとは異なるため、これは libstdc++ を模倣したものです (可能な限り)。文字列ストリームの構築は必要ありませんが、libstdc++ 拡張機能に依存します。今でも Windows で mingw-w64 ターゲットを使用していますが、他の複数のターゲットでも問題なく動作します (long double関数が使用されていない限り)。

于 2015-12-31T13:54:30.397 に答える
0

私にとって、私が持っていることを確認してください:

#include <iostream>  
#include<string>  
using namespace std;

私のファイルでは、to_string(12345)仕事のようなものを作りました。

于 2020-07-19T04:48:07.940 に答える
-3

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

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;
}
于 2013-04-18T12:54:00.797 に答える