我正在尝试完成我的任务。其中说在距离类中创建一个重载的*运算符,以便两个距离可以相乘。这是我的计划:
#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>
)。
请解释我哪里出错了。提前谢谢。
答案 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);
}