为什么代码在添加范围解析参数后可以工作?
Why does the code work after adding scope resolution parameter?
所以我有这个程序,它有一个 3D 点 class 和一个计算两点之间距离的函数。当我在 main 中正常使用 distance 函数时,它会报错。但是当我添加范围解析运算符时,代码就可以工作了。是什么导致了错误以及范围解析运算符是如何修复它的?
此错误发生在 Dev-C++ 和 Codeblocks 中,但在 Atom IDE 中使用带有 MinGW 编译器的 gpp 编译器插件可以正常工作。
#include <iostream>
#include <cmath>
using namespace std;
class Point{...} //Class object with x, y, and z variable and has functions to return values
float distance(Point p1, Point p2);
int main() {
Point P1, P2;
d = distance(P1, P2); // throws an error but just adding -> ::distance(P1, P2) works fine! why?
cout << "Distance between P1 and P2: " << d << endl;
return 0;
}
float distance(Point p1, Point p2) {
float d;
int x0 = p1.getX(), y0 = p1.getY(), z0 = p1.getZ();
int x1 = p2.getX(), y1 = p2.getY(), z1 = p2.getZ();
d = sqrt(pow((x1-x0),2) + pow((y1-y0), 2) + pow((z1-z0), 2));
return d;
}
如果没有实际的错误消息就无法确定,但看起来问题出在 using namespace std;
。
这引入了函数 std::distance()
,这不是您想要的,但是使用范围运算符请求全局 distance()
函数再次起作用。
避免引入整个 std
命名空间。
所以我在 Visual Studio 2019 年和几个在线编译器编译了你的代码,它工作得很好。
我假设了一些事情,但老实说,在这种情况下添加 ::
应该不会影响任何事情。
另外,我找不到你声明的地方float d
,如果你给我们看一下错误信息,事情就清楚了!
#include <iostream>
#include <cmath>
using namespace std;
class Point {
float x=0.f, y=0.f, z=0.f;
public:
Point() {}
Point(float x1, float y1, float z1) :x(x1), y(y1), z(z1) {}
float getX() const{ return x; }
float getY() const{ return y; }
float getZ() const{ return z; }
};//Class object with x, y, and z variable and has functions to return values
float distance(Point p1, Point p2);
int main() {
Point P1, P2;
float d = distance(P1, P2); // throws an error but just adding -> ::distance(P1, P2) works fine! why?
cout << "Distance between P1 and P2: " << d << endl;
return 0;
}
float distance(Point p1, Point p2) {
float d;
int x0 = p1.getX(), y0 = p1.getY(), z0 = p1.getZ();
int x1 = p2.getX(), y1 = p2.getY(), z1 = p2.getZ();
d = sqrt(pow((x1 - x0), 2) + pow((y1 - y0), 2) + pow((z1 - z0), 2));
return d;
}
所以我有这个程序,它有一个 3D 点 class 和一个计算两点之间距离的函数。当我在 main 中正常使用 distance 函数时,它会报错。但是当我添加范围解析运算符时,代码就可以工作了。是什么导致了错误以及范围解析运算符是如何修复它的?
此错误发生在 Dev-C++ 和 Codeblocks 中,但在 Atom IDE 中使用带有 MinGW 编译器的 gpp 编译器插件可以正常工作。
#include <iostream>
#include <cmath>
using namespace std;
class Point{...} //Class object with x, y, and z variable and has functions to return values
float distance(Point p1, Point p2);
int main() {
Point P1, P2;
d = distance(P1, P2); // throws an error but just adding -> ::distance(P1, P2) works fine! why?
cout << "Distance between P1 and P2: " << d << endl;
return 0;
}
float distance(Point p1, Point p2) {
float d;
int x0 = p1.getX(), y0 = p1.getY(), z0 = p1.getZ();
int x1 = p2.getX(), y1 = p2.getY(), z1 = p2.getZ();
d = sqrt(pow((x1-x0),2) + pow((y1-y0), 2) + pow((z1-z0), 2));
return d;
}
如果没有实际的错误消息就无法确定,但看起来问题出在 using namespace std;
。
这引入了函数 std::distance()
,这不是您想要的,但是使用范围运算符请求全局 distance()
函数再次起作用。
避免引入整个 std
命名空间。
所以我在 Visual Studio 2019 年和几个在线编译器编译了你的代码,它工作得很好。
我假设了一些事情,但老实说,在这种情况下添加 ::
应该不会影响任何事情。
另外,我找不到你声明的地方float d
,如果你给我们看一下错误信息,事情就清楚了!
#include <iostream>
#include <cmath>
using namespace std;
class Point {
float x=0.f, y=0.f, z=0.f;
public:
Point() {}
Point(float x1, float y1, float z1) :x(x1), y(y1), z(z1) {}
float getX() const{ return x; }
float getY() const{ return y; }
float getZ() const{ return z; }
};//Class object with x, y, and z variable and has functions to return values
float distance(Point p1, Point p2);
int main() {
Point P1, P2;
float d = distance(P1, P2); // throws an error but just adding -> ::distance(P1, P2) works fine! why?
cout << "Distance between P1 and P2: " << d << endl;
return 0;
}
float distance(Point p1, Point p2) {
float d;
int x0 = p1.getX(), y0 = p1.getY(), z0 = p1.getZ();
int x1 = p2.getX(), y1 = p2.getY(), z1 = p2.getZ();
d = sqrt(pow((x1 - x0), 2) + pow((y1 - y0), 2) + pow((z1 - z0), 2));
return d;
}