我正在制作一个小词汇记忆程序,其中的单词将随机闪现在我的意思中。我想使用标准的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}打开它标志。我做错了什么?
答案 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)
这是旧线程的新答案。一个新的确实出现但很快被撤销, 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;
}