to_string不是std的成员,说g ++(mingw)
我正在制作一个小型的词汇记忆程序,在这个程序中,词语会随机地闪现在我的意思之中。 我想用Bjarne Stroustroup告诉我们的标准C ++库,但是我遇到了一个看起来很奇怪的问题。
我想更改一个long
整型为std::string
以便能够将其存储在一个文件中。 我已经雇用to_string()
为相同。 问题是,当我用g ++(在版本标志中提到的版本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库明确表示它存在,堆栈溢出(对于g ++版本4.5) 早期的问题说,它可以用-std=c++0x
标志打开。 我究竟做错了什么?
这是MinGW下的一个已知的错误。 相关的Bugzilla 。 在评论部分,你可以得到一个补丁 ,使其与MinGW工作。
在MinGW-w64版本中,这个问题已经被修正,比MinGW-w64项目提供的GCC 4.8.0更高。 尽pipe名称,该项目提供了32位和64位的工具链。 Nuwen MinGW发行版也解决了这个问题。
#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>
正如所暗示的,这可能是您的编译器版本的一个问题。
尝试使用以下代码将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; }
使用这个function…
#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
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的一个缺点。 它不支持大多数长双重function,因此不支持C99。
红帽是,
…仍然希望在一个点上获得“long double”function到newlib。
2015年10月25日Corrine也表示 ,
如果有一些具有math知识的人会为newlib贡献缺失的长双重函数,那还是不错的。
所以我们有它。 也许我们中有一个知识和时间可以贡献并成为英雄。
Newlib在这里 。
更改默认的C ++标准
来自 (COMPILE FILE FAILED)错误:'to_string'不是'std'的成员
-std = C ++ 98
到 (编译文件成功)
-std = c ++ 11或-std = c ++ 14
testingCygwin G ++(GCC)5.4.0
事实上, 自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的bug之前,我已经实施了一个解决方法 。 与其他答案中的代码不同,这是对libstdc ++的模拟(尽可能)。 它不需要stringstream的构造,但依赖于libstdc ++扩展。 即使现在我在Windows上使用mingw-w64目标,它仍然适用于多个其他目标(只要long double
function不被使用)。
对于任何人想知道为什么在Android上发生这种情况,可能是因为您使用了错误的c ++标准库。 尝试将build.gradle中的c ++库从gnustl_static
为c++_static
,将CMakeLists.txt中的c ++标准从-std=gnu++11
更改为-std=c++11
如果我们使用模板灯解决scheme(如上所示),如下所示:
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
这是解决问题的一种方法(添加到typessize_t ):
namespace std { std::string to_string(size_t n) { std::ostringstream s; s << n; return s.str(); } }
HTH。
这也发生在我身上,我只是写了一个快速的函数,而不是担心更新我的编译器。
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; }