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库清楚地说存在,Stack Overflow上的之前的一个问题(适用于g++ 4.5版)说它可以用-std=c++0x标志打开。我做错了什么?

419863 次浏览

这是MinGW下的一个已知bug。有关Bugzilla。在评论部分,你可以得到一个补丁,使它与MinGW一起工作。

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

正如建议的那样,这可能是编译器版本的问题。

尝试使用以下代码将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;
}

这也发生在我身上,我只是写了一个快速函数,而不是担心更新我的编译器。

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;
}
#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>

使用这个函数…

    #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 '的成员。< / p >

太糟糕了,也许我们会得到一个最新的答案。根据@Alex的说法,cygwing++ 5.2在2015年11月3日仍然不能工作。

在2015年1月16日,红帽说到问题的Cygwin维护者Corinna Vinschen是newlib的一个缺点。它不支持大多数长双精度函数,因此不支持C99。

红帽公司,

< p >…仍然希望在newlib at中获得“长双”功能 一分。< / p >

2015年10月25日科琳也说

如果有人懂点数学知识就好了 将缺少的长双精度函数贡献给newlib

结果出来了。也许我们中有一个人有知识,有时间,可以做出贡献,成为英雄。

Newlib是在这里

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

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

namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}

不幸的是,我们在某些情况下会遇到问题。例如,对于静态常量成员:

高压泵

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。

对于那些想知道为什么在Android上发生这种情况的人来说,这可能是因为你使用了错误的c++标准库。尝试在构建中更改c++库。gradle从gnustl_staticc++_static, c++标准在你的CMakeLists.txt从-std=gnu++11-std=c++11

更改默认c++标准

(COMPILE FILE FAILED)错误:'to_string'不是'std'的成员

化c + + 98

__abc0(编译文件成功)

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

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

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

在代码块转到设置->编译器设置->编译器标志->选择STD c++11完成。 我也有同样的问题……

对我来说,确保我有:

#include <iostream>
#include<string>
using namespace std;

在我的文件中做了类似to_string(12345)的工作。