to_string 不是 std 的成员,g++ (mingw) 说
Posted
技术标签:
【中文标题】to_string 不是 std 的成员,g++ (mingw) 说【英文标题】:to_string is not a member of std, says g++ (mingw) 【发布时间】:2012-10-10 03:10:47 【问题描述】:我正在制作一个小型词汇记忆程序,其中单词会随机向我闪现以获取含义。正如 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】:
对我来说,确保我有:
#include <iostream>
#include<string>
using namespace std;
在我的文件中做了类似to_string(12345)
的工作。
【讨论】:
【参考方案2】:在代码块中转到设置 -> 编译器设置 -> 编译器标志 -> 选择 std c++11 完成。 我有同样的问题......现在它正在工作!
【讨论】:
【参考方案3】:to_string() 仅存在于 c++11 中,因此如果 c++ 版本较少,请使用一些替代方法,例如 sprintf 或 ostringstream
【讨论】:
【参考方案4】:更改默认 C++ 标准
来自(编译文件失败)错误:“to_string”不是“std”的成员
-std=c++98
到(编译文件成功)
-std=c++11 或 -std=c++14
在 Cygwin G++(GCC) 5.4.0 上测试
【讨论】:
【参考方案5】:对于任何想知道为什么会在 android 上发生这种情况的人,这可能是因为您使用了错误的 c++ 标准库。尝试将 build.gradle 中的 c++ 库从 gnustl_static
更改为 c++_static
,并将 CMakeLists.txt 中的 c++ 标准从 -std=gnu++11
更改为 -std=c++11
【讨论】:
【参考方案6】:正如建议的那样,这可能是您的编译器版本的问题。
尝试使用以下代码将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【参考方案7】:
这是 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-builds 让 std::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 被分叉的一个原因是他们实际上可以修复这个线程所涉及的错误。【参考方案8】:
如果我们使用模板光解决方案(如上所示),如下所示:
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】:事实上,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】: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,感觉令人沮丧......【参考方案11】:使用此功能...
#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【参考方案12】:
#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? 请注意,这不是关于尾随零的精确解决方案。原始的std::to_string(0.75)
通常会返回"0.750000"
(默认的 sprintf %d 格式),而这会返回"0.75"
。原因见这里:***.com/a/13686914/785171【参考方案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 的成员