Why is this program giving an error: to_string is not a member of std. Why?
Why is this program giving an error: to_string is not a member of std. Why?
我使用的是 VS2008 和 Win7 64 位。
#include <iostream>
#include "utils.h"
#include <string>
int main()
{
int gm = DETECT;
int gd = DETECT;
initgraph(&gm, &gd, "");
double x = 0;
double y = 0;
double r = 50;
for(int i=0 ; i<=360 ; i++)
{
x = r * cos(DegreeToRad((double)i));
y = r * sin(DegreeToRad((double)i));
PlotLine(0,0,x,y, YELLOW);
std::string str;
str.append(std::to_string(i));
str.append(". ");
str.append(std::to_string(0));
str.append(", ");
str.append(std::to_string(0));
str.append(") to (");
str.append(std::to_string(x));
str.append(", ");
str.append(std::to_string(y));
str.append("). m=");
str.append(std::to_string(Slope(0,0,x,y)));
str.append("\n");
if(i%90==0)
{
str.append("\ni=");
str.append(std::to_string(i));
str.append("\n");
}
WriteToFile("slope.txt", str.c_str());
}
getch();
closegraph();
return 0;
}
错误信息。
1>e:\slope.test.cpp(21) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(21) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(23) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(23) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(25) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(25) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(27) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(27) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(29) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(29) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(31) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(31) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(37) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(37) : error C3861: 'to_string': identifier not found
1>Generating Code...
1>Build log was saved at "file://e:\Debug\BuildLog.htm"
1>RasterizationLineCircleEllipse - 15 error(s), 14 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
这些错误可能意味着:
- std::to_string 需要 header,您没有包含(但它没有)
- 你没有启用 C++11(我不知道这对 Visual Studio 是如何工作的)
- 您的编译器不支持 C++11。
从评论看来,您使用的 Visual Studio 似乎不支持 C++11,因此您可以使用旧的好字符串流,并使用模板创建 std::to_string 的等价物:
#include <sstream>
#include <string>
template<class T>
std::string toString(const T &value) {
std::ostringstream os;
os << value;
return os.str();
}
//Usage:
std::string valueStr = toString(10);
valueStr.append(toString(1));
valueStr.append(toString(2.5));
请注意,要使用此函数类型 T
需要定义 operator<<
,但这不是类型的问题,std::to_string 支持。
这里除了编译器不支持C++11
的问题外,还有一个我无意中发现的错误原因。
如果您在 Ubuntu 上使用 gcc
,则可以使用 #include <string.h>
,std::to_string
也可以。但这在 Visual Studio 2019
的 MSVC
编译器中失败了,因为 <string.h>
是一个较旧的 C 头文件。要解决,请改用 <string>
。这是 gcc
和 MSVC
编译器之间 C99 和 C++11 标准实现的差异。
我使用的是 VS2008 和 Win7 64 位。
#include <iostream>
#include "utils.h"
#include <string>
int main()
{
int gm = DETECT;
int gd = DETECT;
initgraph(&gm, &gd, "");
double x = 0;
double y = 0;
double r = 50;
for(int i=0 ; i<=360 ; i++)
{
x = r * cos(DegreeToRad((double)i));
y = r * sin(DegreeToRad((double)i));
PlotLine(0,0,x,y, YELLOW);
std::string str;
str.append(std::to_string(i));
str.append(". ");
str.append(std::to_string(0));
str.append(", ");
str.append(std::to_string(0));
str.append(") to (");
str.append(std::to_string(x));
str.append(", ");
str.append(std::to_string(y));
str.append("). m=");
str.append(std::to_string(Slope(0,0,x,y)));
str.append("\n");
if(i%90==0)
{
str.append("\ni=");
str.append(std::to_string(i));
str.append("\n");
}
WriteToFile("slope.txt", str.c_str());
}
getch();
closegraph();
return 0;
}
错误信息。
1>e:\slope.test.cpp(21) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(21) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(23) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(23) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(25) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(25) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(27) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(27) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(29) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(29) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(31) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(31) : error C3861: 'to_string': identifier not found
1>e:\slope.test.cpp(37) : error C2039: 'to_string' : is not a member of 'std'
1>e:\slope.test.cpp(37) : error C3861: 'to_string': identifier not found
1>Generating Code...
1>Build log was saved at "file://e:\Debug\BuildLog.htm"
1>RasterizationLineCircleEllipse - 15 error(s), 14 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
这些错误可能意味着:
- std::to_string 需要 header,您没有包含(但它没有)
- 你没有启用 C++11(我不知道这对 Visual Studio 是如何工作的)
- 您的编译器不支持 C++11。
从评论看来,您使用的 Visual Studio 似乎不支持 C++11,因此您可以使用旧的好字符串流,并使用模板创建 std::to_string 的等价物:
#include <sstream>
#include <string>
template<class T>
std::string toString(const T &value) {
std::ostringstream os;
os << value;
return os.str();
}
//Usage:
std::string valueStr = toString(10);
valueStr.append(toString(1));
valueStr.append(toString(2.5));
请注意,要使用此函数类型 T
需要定义 operator<<
,但这不是类型的问题,std::to_string 支持。
这里除了编译器不支持C++11
的问题外,还有一个我无意中发现的错误原因。
如果您在 Ubuntu 上使用 gcc
,则可以使用 #include <string.h>
,std::to_string
也可以。但这在 Visual Studio 2019
的 MSVC
编译器中失败了,因为 <string.h>
是一个较旧的 C 头文件。要解决,请改用 <string>
。这是 gcc
和 MSVC
编译器之间 C99 和 C++11 标准实现的差异。