我正在尝试完成我的任务。在一个Distance类中创建一个重载的*运算符

时间:2011-10-29 09:21:49

标签: c++ operator-overloading variable-assignment

我正在尝试完成我的任务。其中说在距离类中创建一个重载的*运算符,以便两个距离可以相乘。这是我的计划:

#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>)。

请解释我哪里出错了。提前谢谢。

4 个答案:

答案 0 :(得分:4)

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

将您的课程称为其他内容(例如Distance),或者更好的是,删除using namespace std

P.S。这很好地说明了using namespace X这种方式通常不是一个好主意的原因。

答案 1 :(得分:2)

从代码中删除using namespace std;,并在std::前面添加相应的符号前缀。在标准模板中为迭代器定义了std::distance名称。

(如果operator*作为参数,那么distance const& d会更好。)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您不希望声明由其他名称空间注入的​​名称,该名称与其他人提到的名称相同。由于其名称隐藏了命名空间成员,因此您可以使用::范围运算符来引用自己的名称,也可以更改类的名称。假设您将distance命名为distance1,您希望将乘法运算符编写为:

distance1 distance1::operator* (const distance1 &d1)
{
    return distance1(a*d1.a);
}