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

Posted

技术标签:

【中文标题】为啥添加范围解析参数后代码可以工作?【英文标题】:Why does the code work after adding scope resolution parameter?为什么添加范围解析参数后代码可以工作? 【发布时间】:2019-05-14 09:40:20 【问题描述】:

所以我有这个程序,它有一个 3D 点类和一个找出两点之间距离的函数。当我在 main 中正常使用距离函数时,它会出错。但是当我添加范围解析运算符时,代码可以工作。导致错误的原因以及范围解析运算符如何修复它?

此错误发生在 Dev-C++ 和 Codeblocks 中,但在使用带有 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;


【问题讨论】:

请在问题中包含错误信息 可能重复:***.com/questions/1452721/… 简答:***.com/questions/1452721/… 顺便说一句,您没有在 main 中初始化 P1P2 @FireLancer 我们有代码,但它不完整,并且散布着语法错误,我们没有关于错误实际内容的信息...... 【参考方案1】:

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

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

【讨论】:

它不应该尝试在发布的代码中使用std::distance,即使包含&lt;iterator&gt;float distance(Point p1, Point p2) 应该优先于模板版本。 std::distance 定义在 而不是 @Shriram 没有理由不能包含 ,标准不允许包含附加文件【参考方案2】:

所以我在 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;

【讨论】:

以上是关于为啥添加范围解析参数后代码可以工作?的主要内容,如果未能解决你的问题,请参考以下文章

bert原码解析(embedding)

为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?

为啥当作为值返回时,类内部的结构定义需要范围解析?

nginx解析漏洞

volatile原理解析

XAMPP 问题?保存后代码不变