我正在制作一个小的词汇记忆程序,其中单词会随机闪现给我以了解含义。正如 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 库 清楚地说 它存在并且 Stack Overflow 上的一个早期问题(对于 g++ 版本 4.5)说它可以用
-std=c++0x
标志打开。我做错了什么?
这是 MinGW 下的一个已知错误。 相关的 Bugzilla。在评论部分,您可以获得补丁以使其与MinGW一起使用。
此问题已在 MinGW-w64 项目 提供的高于 GCC 4.8.0 的 MinGW-w64 发行版中修复。尽管名称如此,但该项目提供了 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;
}
使用这个功能...
#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
这是对旧线程的新答案。一个新的确实出现了,但很快就被取消了, Cygwin:g++ 5.2:“to_string”不是“std”的成员。
太糟糕了,也许我们会得到更新的答案。根据@Alex 的说法,截至 2015 年 11 月 3 日,Cygwin g++ 5.2 仍无法正常工作。
2015 年 1 月 16 日,Red Hat 的 Cygwin 维护者 Corinna Vinschen 表示问题是 newlib 的一个缺点。它不支持大多数 long double 函数,因此不支持 C99。
红帽是,
...仍然希望在 newlib 中获得“long double”功能 一分。
2015 年 10 月 25 日 Corrine 还说,
如果有一点数学知识的人会更好 将缺少的 long double 函数贡献给 newlib.
所以我们有了它。也许我们中有知识和时间的人可以做出贡献并成为英雄。
Newlib 在这里.
更改默认 C++ 标准
From(编译文件失败)错误:“to_string”不是“std”的成员
-std=c++98
到(编译文件成功)
-std=c++11 或 -std=c++14
在 Cygwin G++(GCC) 5.4.0 上测试
如果我们使用像下面这样的模板光解决方案(如上所示):
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.
to_string() 仅存在于 c++11 中,因此如果 c++ 版本较少,请使用一些替代方法,例如 sprintf 或 ostringstream
事实是 libstdc++ 实际上在 *-w64-mingw32 目标中支持
std::to_string
自 4.8.0 以来。但是,这不包括对 MinGW.org、Cygwin 和变体的支持(例如来自 MSYS2 的 *-pc-msys)。另见https://cygwin.com/ml/cygwin/2015-01/msg00245.html.
在为 MinGW-w64 解决错误之前,我已经实施了解决方法。与其他答案中的代码不同,这是对 libstdc++ 的模仿(尽可能)。它不需要字符串流构造,但依赖于 libstdc++ 扩展。即使现在我在 Windows 上使用 mingw-w64 目标,它仍然适用于多个其他目标(只要
long double
功能未被使用)。
对于任何想知道为什么在 Android 上会发生这种情况的人来说,这可能是因为您使用了错误的 c++ 标准库。尝试将 build.gradle 中的 c++ 库从
gnustl_static
更改为 c++_static
并将 CMakeLists.txt 中的 c++ 标准从 -std=gnu++11
更改为 -std=c++11
在代码块中转到设置 -> 编译器设置 -> 编译器标志 -> 选择 std c++11 完成。 我有同样的问题......现在它正在工作!
对我来说,确保我有:
#include <iostream>
#include<string>
using namespace std;
在我的文件中做了类似
to_string(12345)
的工作。
以下功能解决了我的问题。 来源:https://gist.github.com/mfathirirhas/6ba63fd59cc08b5b2583d52f17a20257
std::string to_string(int i)
{
std::stringstream ss;
ss << i;
return ss.str();
}
这也发生在我身上,我只是写了一个快速函数而不是担心更新我的编译器。
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;
}