я пытаюсь выполнить свое задание. которое говорит, что в классе расстояния создайте перегруженный оператор * - PullRequest
1 голос
/ 29 октября 2011

Я пытаюсь выполнить свое задание. В сообщении говорится, что в классе 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>).

Пожалуйста, объясните, где я ошибаюсь. Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 29 октября 2011

Уже есть функция с именем std::distance, которую вы вводите в область действия через using namespace std и которая конфликтует с вашим классом distance.

Назовите свой класс как-нибудь еще (например, Distance) или, еще лучше, удалите using namespace std.

P.S. Это хорошая иллюстрация того, почему using namespace X таким образом обычно не является хорошей идеей.

2 голосов
/ 29 октября 2011

Удалите using namespace std; из вашего кода и добавьте соответствующие символы к std::. В стандартных шаблонах для имен итераторов определено имя std::distance.

(Ваш operator* было бы лучше, если бы в качестве параметра он принимал distance const& d.)

1 голос
/ 29 октября 2011

Вы не хотите объявлять имя, которое вводится другим пространством имен в той же области, что и другие.Поскольку его имя скрывает член пространства имен, вы можете использовать оператор области действия :: для ссылки на собственное имя или изменить имя вашего класса.Предполагая, что если вы назвали distance как distance1, вы хотите написать свой оператор умножения как:

distance1 distance1::operator* (const distance1 &d1)
{
    return distance1(a*d1.a);
}
1 голос
/ 29 октября 2011

distance также является именем функции шаблона в стандартном либарии. Я сильно подозреваю, что, поскольку вы using namespace std;, это неоднозначно.

...