我正在制作一个小的词汇记忆程序,其中的单词会随机向我闪烁以获取含义。我想使用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库清楚地表明了它的存在,并且关于Stack Overflow的早期问题(对于g ++ 4.5版)说可以使用-std=c++0x标志将其打开。我在做什么错?

评论

适用于我的GCC 4.4.5(即出现“模糊过载”错误);也许您的libstdc ++已经过时了?

它适用于使用GCC 4.5.1。的Ideone。

这对我适用于g ++ 4.6.3。您的错误涉及第11行。您说您的程序“基本上已简化为”您的代码,但是您发布的代码是否也给出该错误?

@VaughnCato-是的,这是确切的程序。我应该对其进行编辑以使其更加清晰。另外,我在那儿干什么?

即使我使用的是GCC 5.3.1,这对我也不起作用。但是,解决此问题的方法只是使用更高的C ++标准-即通过使用标志-std = c ++ 11或更高版本进行编译。

#1 楼

这是MinGW下的一个已知错误。相关的Bugzilla。在注释部分中,您可以获取一个修补程序以使其能够与MinGW一起使用。

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

评论


此处进一步讨论:stackoverflow.com/questions/8542221/…

–本
2012年11月2日,3:09

我正在使用MinGW-w64版本4.8.1,但无法正常工作。我从问题中复制了确切的程序。我仍然得到'to_string'不是'std'错误的成员。我将其编译为:g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp

– Zam664
2013年12月2日于16:58

@ zam664我无法解释为什么,但是我通过MinGW构建通过安装MinGW 4.8.1(特别是x32-4.8.1-posix-dwarf-rev5)使std :: to_string工作。相反,to_string不适用于通过“ mingw-get”安装程序或TDM-GCC软件包安装的MinGW 4.8.1。

–塞兰
14年4月16日在12:20

补丁对我来说还不够,我必须在C:\ MinGW \ lib \ gcc \ mingw32 \ 4.8.1 \ include \ c ++ \ mingw32 \ bits \ c ++ config.h中#define _GLIBCXX_USE_C99 1

–祖克
2015年3月19日19:47



@Cerran“ MinGW-builds”是MinGW-w64的版本,与MinGW不同。 MinGW-w64被分叉的原因之一是,它们实际上可以修复与该线程有关的错误。

– M.M
16-3-27在7:33



#2 楼

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

–杰基
16年2月2日在17:34

请注意,这不是尾随零的确切解决方案。原始的std :: to_string(0.75)通常将返回“ 0.750000”(默认sprintf%d格式),而其将返回“ 0.75”。原因请参见此处:stackoverflow.com/a/13686914/785171

– Krzysztof Bociurko
17年9月29日在10:02

#3 楼

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

尝试使用以下代码将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年10月19日14:18



请注意,如果要使用std :: string,则要改用.str()。

–克里斯蒂安·曼(Christian Mann)
2014年11月30日在22:34

请注意,这不是尾随零的确切解决方案。原始的std :: to_string(0.75)通常将返回“ 0.750000”(默认sprintf%d格式),而其将返回“ 0.75”。原因请参见此处:stackoverflow.com/a/13686914/785171

– Krzysztof Bociurko
17年9月29日在10:02

#4 楼

使用此功能...

    #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


评论


无论代码多么容易理解,请在答案中添加一些解释(至少要有注释)。

–vefthym
2014年6月3日下午6:53

有一个解决方法很好,但是我认为通常最好弄清楚为什么标准解决方案不编译而不是一起破解

–马特·库伯勒
2014年6月3日下午6:56

“标准”方式(std :: to_string)通常有效-除非无效。 sstream是“标准”解决方法。

–尼克·旺斯(Nick Vence)
14-10-25在0:47

请注意,这不是尾随零的确切解决方案。原始的std :: to_string(0.75)通常将返回“ 0.750000”(默认sprintf%d格式),而其将返回“ 0.75”。原因请参见此处:stackoverflow.com/a/13686914/785171

– Krzysztof Bociurko
17年9月29日在10:02

#5 楼

to_string是Cygwin的当前问题

这是对旧线程的全新回答。一个新的确实出现了,但很快就被取消了,
Cygwin:g ++ 5.2:“ to_string”不是“ std”的成员。

太糟糕了,也许我们会得到更新的答案。根据@Alex的说法,截至2015年11月3日,Cygwin g ++ 5.2仍无法运行。

2015年1月16日,Red Hat的Cygwin维护人员Corinna Vinschen表示,问题是newlib的缺点。它不支持大多数长的double函数,因此不支持C99。

Red Hat是,


...仍然希望可以在
一点将new的“ long double”功能引入到newlib中。 >

2015年10月25日,Corrine也说,


如果有一点数学知识的人愿意做出贡献,那仍然很好。缺少newlib的长双精度函数。


所以我们有了它。也许我们当中一个拥有知识和时间的人可以贡献自己并成为英雄。

Newlib在这里。

评论


仅看到今年它们是如何从通过邮件发送补丁程序迁移到git的,这令人感到沮丧...

– rr-
2015年12月6日13:59

#6 楼

更改默认的C ++标准

从(COMPILE FILE FAILED)错误:'to_string'不是'std'的成员



-std = c ++ 98


至(成功完成文件)


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


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

#7 楼

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

#8 楼

事实是,从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的错误之前,我已经实施了变通方法。与其他答案中的代码不同,这是对libstdc ++的模仿(尽可能)。它不需要字符串流构造,但取决于libstdc ++扩展。即使现在我在Windows上使用mingw-w64目标,它仍然可以很好地用于其他多个目标(只要不使用long double函数)。

#9 楼

如果我们使用如下所示的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


这是解决问题的一种方法(添加到size_t类型):

namespace std {
    std::string to_string(size_t n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}


HTH。

#10 楼

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

#11 楼

在代码块中,转到设置->编译器设置->编译器标志->选择std c ++ 11完成。
我遇到了同样的问题...现在可以使用了!

#12 楼

对我来说,确保我拥有:
 #include <iostream>  
#include<string>  
using namespace std;
 

在我的文件中可以使to_string(12345)正常工作。

#13 楼

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

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


评论


这不是std :: to_string的替代品,绝对不是问题的答案。

– Verax
13年10月8日在8:34

不要忘记也实现std :: cout!重新解决很多根本的错误要比找出根本问题好得多!

– jmc
2015年2月11日在16:15

您使事情变得过于复杂。只是ones_char ='0'+数字%10;

–phuclv
18-10-28在2:16