to_string 不是 std 的成员,g++ (mingw) 说

Posted

技术标签:

【中文标题】to_string 不是 std 的成员,g++ (mingw) 说【英文标题】:to_string is not a member of std, says g++ (mingw) 【发布时间】:2012-10-19 13:29:10 【问题描述】:

我正在制作一个小型词汇记忆程序,其中的单词会随机向我闪现以获取含义。正如 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 库 clearly says 它存在并且 Stack Overflow 上的 an earlier question(对于 g++ 版本 4.5)说它可以使用 -std=c++0x 标志打开。我做错了什么?

【问题讨论】:

适用于我的 GCC 4.4.5(即,给出“模棱两可的重载”错误);也许你的libstdc++ 已经过时了? It works on Ideone,它使用 GCC 4.5.1。 这对我来说适用于 g++ 4.6.3。您的错误是指第 11 行。您说您的程序“基本上已简化为”您的代码,但是您发布的代码是否也给出了该错误? @VaughnCato - 是的,这就是确切的程序。我应该编辑它以使其更清晰。另外,那个流浪的 int 我在那里做什么? 这对我也不起作用,即使我使用的是 GCC 5.3.1。然而,修复它的方法只是使用更高版本的 C++ 标准 - 即使用标志 -std=c++11 或更高版本进行编译。 【参考方案1】:

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

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

【讨论】:

在这里进一步讨论:***.com/questions/8542221/… 我正在使用 MinGW-w64 版本 4.8.1,但它无法正常工作。我从问题中复制了确切的程序。我仍然得到 'to_string' is not a member of 'std' 错误。我将其编译为: g++ -std=c++0x -o tostring_test.exe tostring_test.cpp @zam664 我无法解释原因,但我通过安装 MinGW 4.8.1(特别是 x32-4.8.1-posix-dwarf-rev5通过 MinGW-buildsstd::to_string 工作。相比之下,to_string与通过“mingw-get”安装程序或 TDM-GCC 包安装的 MinGW 4.8.1 一起工作。 补丁对我来说还不够,我不得不按照here 的描述在#define _GLIBCXX_USE_C99 1 中输入here @Cerran "MinGW-builds" 是 MinGW-w64 的构建,与 MinGW 不同的项目。 MinGW-w64 被分叉的一个原因是他们实际上可以修复这个线程所涉及的错误。【参考方案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 &lt;sstream&gt;

【讨论】:

有没有办法同时包含 stod? 请注意,这不是关于尾随零的精确解决方案。原始的std::to_string(0.75) 通常会返回"0.750000"(默认的 sprintf %d 格式),而这会返回"0.75"。原因见这里:***.com/a/13686914/785171【参考方案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;

【讨论】:

我还没有运行它,但感谢您解决了我眼前的难题。现在我只需要弄清楚它是如何工作的。 :) 请注意,如果你想要std::string,你想改用.str() 请注意,这不是关于尾随零的精确解决方案。原始的std::to_string(0.75) 通常会返回"0.750000"(默认的 sprintf %d 格式),而这会返回"0.75"。原因见这里:***.com/a/13686914/785171【参考方案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

【讨论】:

请在你的答案中添加一些解释(至少是 cmets),无论代码多么容易理解。 有一个解决方法很好,但我认为通常最好弄清楚为什么 std 解决方案没有编译而不是一起破解一些东西 “标准”方式 (std::to_string) 通常有效——除非它不可用。 sstream 是“标准”解决方法。 请注意,这不是关于尾随零的精确解决方案。原始的std::to_string(0.75) 通常会返回"0.750000"(默认的sprintf %d 格式),而这会返回"0.75"。原因见这里:***.com/a/13686914/785171【参考方案5】:

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 日,Red Hat 的 Cygwin 维护者 Corinna Vinschen said the problem 是 newlib 的一个缺点。它不支持大多数 long double 函数,因此不支持 C99。

红帽是,

... 仍然希望在 newlib 中获得“long double”功能 一点。

2015 年 10 月 25 日Corrine also said,

如果有一点数学知识的人会 将缺失的 long double 函数贡献给 newlib。

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

Newlib 是 here。

【讨论】:

今年看到他们如何从通过邮件发送补丁迁移到 git,感觉令人沮丧......【参考方案6】:

更改默认 C++ 标准

来自(编译文件失败)错误:“to_string”不是“std”的成员

-std=c++98

(编译文件成功)

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

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

【讨论】:

【参考方案7】:

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

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。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

事实上,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 函数)。

【讨论】:

【参考方案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 的替代品,也绝对不是问题的答案。 别忘了实现 std::cout !用大量额外的错误重新实现比找出根本问题要好得多! 你让事情变得过于复杂。就ones_char = '0' + number % 10;

以上是关于to_string 不是 std 的成员,g++ (mingw) 说的主要内容,如果未能解决你的问题,请参考以下文章

C++ to_string 不是 Dev C++ 上 std 的成员

cygwin g++ std::stoi“错误:‘stoi’不是‘std’的成员

std::thread 错误(线程不是 std 的成员)

“setprecision”不是“std”的成员

std::to_string(double) 的精度

std::to_string - 多个重载函数的实例与参数列表匹配