我正在做一个小的词汇记忆程序,其中的单词会随机地闪现在我的意思。正如Bjarne Stroustroup告诉我们的那样,我想使用标准c++库,但我刚开始就遇到了一个看似奇怪的问题。

我想改变一个长整数为std::字符串,以便能够将它存储在文件中。我已经使用to_string()同样。问题是,当我用g++(版本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标志打开。我做错了什么?


当前回答

to_string是Cygwin当前的一个问题

这是一个老帖子的新答案。一个新的提议确实出现了,但很快就被撤销了, Cygwin: g++ 5.2: ' to_string '不是' std '的成员。

太糟糕了,也许我们会得到一个最新的答案。根据@Alex的说法,cygwing++ 5.2在2015年11月3日仍然不能工作。

2015年1月16日,红帽公司的Cygwin维护者Corinna Vinschen表示,这个问题是newlib的一个缺点。它不支持大多数长双精度函数,因此不支持C99。

红帽公司,

... 仍然希望在newlib at中获得“长双”功能 一分。

2015年10月25日,科瑞恩还说,

如果有人懂点数学知识就好了 将缺少的长双精度函数贡献给newlib。

结果出来了。也许我们中有一个人有知识,有时间,可以做出贡献,成为英雄。

Newlib在这里。

其他回答

更改默认c++标准

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

-std=c++98

到(编译文件成功)

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

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

事实上,从4.8.0开始,libstdc++实际上在*-w64-mingw32目标中支持std::to_string。然而,这并不包括对MinGW.org、Cygwin及其变体的支持(例如MSYS2中的*-pc-msys)。参见https://cygwin.com/ml/cygwin/2015-01/msg00245.html。

在MinGW-w64的bug解决之前,我已经实现了一个解决方案。与其他答案中的代码不同,这是对libstdc++的模拟(尽可能地)。它不需要字符串流构造,但依赖于libstdc++扩展。即使现在我在Windows上使用mingw-w64目标,它仍然适用于多个其他目标(只要不使用双函数)。

这是MinGW下的一个已知bug。Bugzilla相关。在评论区,你可以获得一个补丁,使它与MinGW一起工作。

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

使用这个函数…

    #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

to_string是Cygwin当前的一个问题

这是一个老帖子的新答案。一个新的提议确实出现了,但很快就被撤销了, Cygwin: g++ 5.2: ' to_string '不是' std '的成员。

太糟糕了,也许我们会得到一个最新的答案。根据@Alex的说法,cygwing++ 5.2在2015年11月3日仍然不能工作。

2015年1月16日,红帽公司的Cygwin维护者Corinna Vinschen表示,这个问题是newlib的一个缺点。它不支持大多数长双精度函数,因此不支持C99。

红帽公司,

... 仍然希望在newlib at中获得“长双”功能 一分。

2015年10月25日,科瑞恩还说,

如果有人懂点数学知识就好了 将缺少的长双精度函数贡献给newlib。

结果出来了。也许我们中有一个人有知识,有时间,可以做出贡献,成为英雄。

Newlib在这里。