我正在做一个小的词汇记忆程序,其中的单词会随机地闪现在我的意思。正如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标志打开。我做错了什么?


当前回答

对于那些想知道为什么在Android上发生这种情况的人来说,这可能是因为你使用了错误的c++标准库。尝试在构建中更改c++库。gradle从gnustl_static到c++_static, c++标准在你的CMakeLists.txt从-std=gnu++11到-std=c++11

其他回答

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

这也发生在我身上,我只是写了一个快速函数,而不是担心更新我的编译器。

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;
}

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在这里。

对于那些想知道为什么在Android上发生这种情况的人来说,这可能是因为你使用了错误的c++标准库。尝试在构建中更改c++库。gradle从gnustl_static到c++_static, c++标准在你的CMakeLists.txt从-std=gnu++11到-std=c++11

正如建议的那样,这可能是编译器版本的问题。

尝试使用以下代码将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;
}