添加范围解析参数后,为什么代码可以工作?

时间:2019-05-14 09:40:20

标签: c++ dev-c++

因此,我有一个具有3D点类的程序,该函数可以找出两个点之间的距离。当我在主体上正常使用距离功能时,会出现错误。但是,当我添加范围解析运算符时,代码就可以工作了。是什么原因导致该错误以及范围解析运算符如何修复该错误?

此错误在Dev-C ++和代码块中发生,但在Atom IDE上使用带有MinGW编译器的gpp-compiler插件的Atom IDE可以很好地工作。

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

2 个答案:

答案 0 :(得分:1)

没有实际的错误消息就无法确定,但是看起来问题出在using namespace std;上。 这会带来您不想要的功能std::distance(),但是使用范围运算符来请求全局distance()功能再次起作用。

避免引入整个std名称空间。

答案 1 :(得分:1)

因此,我在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;
}