g_s(mingw)说to_string不是std的成员

时间:2012-10-19 13:29:10

标签: c++ c++11 g++ mingw tostring

我正在制作一个小词汇记忆程序,其中的单词将随机闪现在我的意思中。我想使用标准的C ++库,就像Bjarne Stroustroup告诉我们的那样,但我遇到了一个看似奇怪的问题。

我想将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库clearly says和Stack Overflow上的an earlier question(对于g ++版本4.5)说可以使用{{1}打开它标志。我做错了什么?

13 个答案:

答案 0 :(得分:210)

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

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

答案 1 :(得分:112)

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

答案 2 :(得分:45)

根据建议,这可能是您的编译器版本的问题。

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

答案 3 :(得分: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

答案 4 :(得分:12)

to_string是Cygwin

的当前问题

这是旧线程的新答案。一个新的确实出现但很快被撤销, Cygwin: g++ 5.2: ‘to_string’ is not a member of ‘std’

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

2015年1月16日红帽said the problem的Cygwin维护者Corinna Vinschen是newlib的缺点。它不支持大多数长双精度函数,因此不支持C99。

红帽是,

  

...仍然希望将“long double”功能带入newlib   一点。

2015年10月25日Corrine also said

  

如果有一点数学知识的人会这样,那仍然会很好   将缺少的长双重函数贡献给newlib。

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

Newlib是here

答案 5 :(得分:5)

更改默认C ++标准

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

  

-std = C ++ 98

(成功编译文件)

  

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

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

答案 6 :(得分:2)

事实是libstdc ++实际上支持* -w64-mingw32目标since 4.8.0中的std::to_string。但是,这不包括对MinGW.org,Cygwin和变体的支持(例如来自MSYS2的* -pc-msys)。另请参阅https://cygwin.com/ml/cygwin/2015-01/msg00245.html

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

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

不幸的是,在某些情况下我们会遇到问题。例如,对于 static 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。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

在代码块中的

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

答案 11 :(得分:0)

对我来说,请确保我拥有:

#include <iostream>  
#include<string>  
using namespace std;
我的文件中的

使to_string(12345)的工作正常。

答案 12 :(得分:-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;
}