我正在努力完成我的作业.在Distance类中创建一个重载*操作符

i am trying to complete my assignment.which says In a Distance class create an overloaded * operator

本文关键字:一个 重载 操作符 我的 努力完成 作业 Distance 创建      更新时间:2023-10-16

我正在努力完成我的作业。在Distance类中创建一个重载*操作符,以便两个距离可以相乘。下面是我的程序:

#include<iostream>
using namespace std;
class distance
{
private:
    int a;
public:
    distance():a(10){}
    distance(int x)
    {
        a=x;
    }
    void print()
    {
    cout<<"n a = "<<a<<" n ";
    }
    distance operator *(distance);
};
distance distance :: operator *(distance d)
{
    a=a*d.a;
    return distance(a);
}
int main()
{
distance d1,d2,d3;
d1.print();
d2.print();
d3.print();
d3=d1 * d2;
d3.print();
return 0;
}

但是我得到一个编译错误说:

'distance' : ambiguous symbol.

当我在vc++上运行时

但是它在Turbo C上运行良好(通过微小的改变:#include<iostream.h>)。

请解释我错在哪里。

已经有一个名为std::distance的函数,您将通过using namespace std将其引入范围,并且与您的distance类发生冲突。

将你的类命名为其他名称(例如Distance),或者更好的是,删除using namespace std

注:这很好地说明了为什么这种方式的using namespace X通常不是一个好主意

从代码中删除using namespace std;,并在适当的符号前面加上std::。在标准模板中为迭代器定义了一个std::distance名称。

(如果您的operator*distance const& d作为其参数会更好)

distance也是标准库中模板函数的名称。我强烈怀疑,因为你是using namespace std;,它是模糊的。

您不希望声明的名称是由其他人提到的同一作用域内的另一个名称空间注入的。因为它的名称隐藏了名称空间成员,所以您可以使用::作用域操作符来引用您自己的名称,也可以更改类的名称。假设您将distance命名为distance1,您希望将乘法运算符编写为:

distance1 distance1::operator* (const distance1 &d1)
{
    return distance1(a*d1.a);
}
相关文章: