g ++(mingw)表示to_string不是std的成员


245

我正在制作一个小的词汇记忆程序,其中的单词会随机向我闪烁以获取含义。我想使用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标志将其打开。我究竟做错了什么?


5
与我的GCC 4.4.5兼容(即,给出“歧义过载”错误);也许你libstdc++已经过时了?
弗雷德·富

3
适用于使用GCC 4.5.1的Ideone
Kerrek SB 2012年

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

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

2
即使我使用的是GCC 5.3.1,这对我也不起作用。但是,解决该问题的方法只是使用更高的C ++标准-即通过使用flag -std=c++11或更高版本进行编译。
阿图罗·唐·胡安

Answers:


212

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

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


2
进一步的讨论在这里:stackoverflow.com/questions/8542221/...

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

5
@ zam664我无法解释原因,但是我必须通过MinGW-buildsstd::to_string安装MinGW 4.8.1(特别是x32-4.8.1-posix-dwarf-rev5)来工作。相比之下,没有使用MinGW 4.8.1通过无论是“MinGW的,得到”安装程序或TDM-GCC软件包安装工作。to_string
Cerran 2014年

5
这个补丁是不够的,我不得不#define _GLIBCXX_USE_C99 1C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h描述这里
祖克

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

116
#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?
杰基

我从其他源文件调用您的函数:patch :: to_string(errorCode)(其中errorCode为int),编译器在该行给我一个错误。错误是:对`std :: string patch :: to_string <int>(int&)'的未定义引用但是,只要我在同一源文件中包含您的代码,编译器就不会抱怨。我正在尝试找出问题所在。
Nikos,2016年

1
请注意,这不是尾随零的确切解决方案。原始std::to_string(0.75)通常会返回"0.750000"(默认为sprintf%d格式),而这将返回"0.75"。原因请看这里:stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

47

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

尝试使用以下代码将转换longstd::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年

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

1
请注意,这不是尾随零的确切解决方案。原始std::to_string(0.75)通常会返回"0.750000"(默认为sprintf%d格式),而这将返回"0.75"。原因请看这里:stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

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

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

4
这是很好的有一个解决办法,但我认为它通常最好弄清楚为什么性病解决方案是不编译,而不是黑客的东西一起
马特Coubrough

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

请注意,这不是尾随零的确切解决方案。原始std::to_string(0.75)通常会返回"0.750000"(默认为sprintf%d格式),而这将返回"0.75"。原因请看这里:stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

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。

红帽是

...仍然希望在某一时刻将“ long double”功能引入newlib。

2015年10月25日,Corrine也说

如果有些数学知识的人会为newlib贡献缺少的long double函数,那仍然会很好。

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

Newlib在这里


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

8

更改默认的C ++标准

来自(COMPILE FILE FAILED)错误:“ to_string”不是“ std”的成员

-std = c ++ 98

(成功完成文件)

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

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


3

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


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不使用功能)。


2

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


1

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

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。


0

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


-4

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

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

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

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

您使事情变得过于复杂。Justones_char = '0' + number % 10;
phuclv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.