263

我正在制作一个小型词汇记忆程序,其中单词会随机向我闪现以获取含义。正如 Bjarne Stroustroup 告诉我们的那样,我想使用标准 C++ 库,但我一开始就遇到了一个看似奇怪的问题。

我想将long整数更改为std::string以便能够将其存储在文件中。我也受雇于to_string()此。问题是,当我用 g++ 编译它时(版本 4.7.0 如其 --‍version 标志所述),它说:

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标志打开。我究竟做错了什么?

4

13 回答 13

217

这是 MinGW 下的一个已知错误。相关的 Bugzilla。在评论部分,您可以获得一个补丁以使其与 MinGW 一起使用。

此问题已在 MinGW-w64 发行版中修复,该发行版高于MinGW-w64 项目提供的 GCC 4.8.0 。尽管名称如此,该项目提供了 32 位和 64 位的工具链。Nuwen MinGW 发行版也解决了这个问题。

于 2012-10-19T13:43:45.113 回答
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 转换longstd::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,那还是很好的。

因此,我们有它。也许我们中的一个有知识和时间的人可以做出贡献并成为英雄。

新库在这里

于 2015-11-26T04:49:24.847 回答
8

更改默认 C++ 标准

(编译文件失败)错误:“to_string”不是“std”的成员

-std=c++98

(编译文件成功)

-std=c++11 或 -std=c++14

在 Cygwin G++(GCC) 5.4.0 上测试

于 2017-06-10T00:21:23.713 回答
3

如果我们使用模板光解决方案(如上所示),如下所示:

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

这是解决问题的一种方法(添加到类型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 回答
3

to_string() 仅存在于 c++11 中,因此如果 c++ 版本较少,请使用一些替代方法,例如sprintfostringstream

于 2018-10-29T08:20:59.420 回答
2

事实上,自 4.8.0 以来std::to_string,*-w64-mingw32 目标实际上支持 libstdc++ 。但是,这不包括对 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 回答
2

对于任何想知道为什么会在 Android 上发生这种情况的人,可能是因为您使用了错误的 c++ 标准库。尝试将 build.gradle 中的 c++ 库从gnustl_statictoc++_static和 CMakeLists.txt 中的 c++ 标准从-std=gnu++11to-std=c++11

于 2016-10-18T23:04:14.877 回答
1

在代码块中转到设置-> 编译器设置-> 编译器标志-> 选择 std c++11 完成。我有同样的问题......现在它正在工作!

于 2018-12-12T20:48:09.030 回答
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 回答