Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с перегрузкой операций в C++ Buildere 
:(
    Опции темы
C'hoosen++
  Дата 10.2.2004, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.1.2004

Репутация: нет
Всего: нет



Примерчик:
Код

class distance
{
private:
    int feet;
    float inches;
public:
    distance()
       { feet = 0; inches = 0.0; }
    distance( float fltfeet )
    {  
         feet = int( fltfeet );
         inches = 12*( fltfeet - feet );
    }
    distance( int ft, float in )
    {
         feet = ft;
         inches = in;
    }
    void showdist()
    {    cout<<feet<<"\'-"<<inches<<'\"'; }

    friend distance operator + (distance, distance);
    friend distance operator * (distance, distance);
};


Так вот дружественные функции перегрузки двух операций в Buildere
не работают. Компилятор пишет типа:
E2015 Ambiguity between 'distance' and 'std::distance<ForwardIterator>(ForwardIterator,ForwardIterator)' . Почему?
Хотя в VC++ все работает!

PM MAIL   Вверх
FreshMeat
Дата 10.2.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 30.1.2004

Репутация: нет
Всего: нет



Cоздается впечатление что ты привел не весь код необходимый для воспроизведения ошибки.
Ошибка, похоже возникает, из-за того, что компилятор не может определить который из distance ему использовать - твой или определенный в пространстве имен std... причем компилятор ругается вовсе не дружественные ф-ии, а на конструктор с двумя аргументами...
Потребуется явно определить в коде использующем distance, что именно надо сделать: сконструировать твой объект или вызвать ф-ю из пространства имен std...

ПС. Я там понимаю, код отвечает за хранение расстояния, причем должен уметь преобразовывать дистанцию между различные системы измерений... Небольшой комментарий. Можно иметь только одно свойство в классе для хранения значения, допустим, в системе Си и переводить его по требованию в любую другую, таким образом избавиться от лишнего поля и его модификации в каждом методе - получается более читаемый код с потенциально меньшим количеством ошибок (можно забыть модифицировать одно из свойств в каком-либо методе)
Да, не забудь определить оператор присваивания
И конструкторы (по крайней мере с одним аргументом), лучше делать explicit
PM MAIL   Вверх
C'hoosen++
Дата 10.2.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.1.2004

Репутация: нет
Всего: нет



То что ошибка в аргументах функций - это я и сам знаю (уж английским вла-
дею нормально)!
Если тебя волнует остаток кода, так вот он:
Код

distance operator + (distance d1, distance d2)
{
    int f = d1.feet + d2.feet;
    float i = d1.inches + d2.inches;
    if( i>=12.0 )
       { i -=12.0; f++; }

    return distance( f, i );
}
//---------------------------------------------------------------------------
distance operator * (distance d1, distance d2)
{
    int f = d1.feet * d2.feet;
    float i = d1.inches * d2.inches;
    if( i>=12.0 )
       { i -=12.0; f++; }

    return distance( f, i );
}
//---------------------------------------------------------------------------
int main()
{
    distance d1 =2.5;
    distance d2 = 1.25;
    distance d3;
    cout<<"d1= "; d1.showdist();
    cout<<"d2= "; d2.showdist();
    d3 = d1 +10.0;
    cout<<"d3= "; d3.showdist();
    d3 = 10.0 + d1;
    cout<<"d3= "; d3.showdist();
    cout<<"-----now * ---------";

    return 0;
}


И именно ошибка с разрешением пространства std.
Но суть вопроса в том, что на VC++ все работате, а на Buildere нет.

Это сообщение отредактировал(а) C'hoosen++ - 10.2.2004, 21:51
PM MAIL   Вверх
FreshMeat@Home
Дата 11.2.2004, 00:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











О! То, чего не хватало...
Тестируем...
Код
VC 7.1 + STLPort4.6
d:\projects\tstCompCode\main.cpp(52) : error C2872: 'distance' : ambiguous symbol
       could be 'd:\projects\tstCompCode\main.cpp(5) : distance'
       or       'distance'
d:\projects\tstCompCode\main.cpp(53) : error C2872: 'distance' : ambiguous symbol
       could be 'd:\projects\tstCompCode\main.cpp(5) : distance'
       or       'distance'
d:\projects\tstCompCode\main.cpp(54) : error C2872: 'distance' : ambiguous symbol
       could be 'd:\projects\tstCompCode\main.cpp(5) : distance'
       or       'distance'

Код

Borland C++ 5.6 for Win32 Copyright (c) 1993, 2002 Borland

Error E2015 123.cpp 52: Ambiguity between 'distance' and '_STL::distance<_InputI
terator,_Distance>(const _InputIterator &,const _InputIterator &,_Distance &)' i
n function main()
Error E2015 123.cpp 53: Ambiguity between 'distance' and '_STL::distance<_InputI
terator,_Distance>(const _InputIterator &,const _InputIterator &,_Distance &)' i
n function main()
Error E2015 123.cpp 54: Ambiguity between 'distance' and '_STL::distance<_InputI
terator,_Distance>(const _InputIterator &,const _InputIterator &,_Distance &)' i
n function main()

так что компиляторы на редкость единодушны smile.gif Причина очевидна.
Лечится следующим образом
Код

int main()
{
   using namespace std;
   ::distance d1 =2.5; //
   ::distance d2 = 1.25;
   ::distance d3;
   //...
}


Что касается твоей ошибки, то как я понимаю, она воспроизводится на шестой студии (дома проверить не могу - ее просто нет). Объясняется слабым соблюдением стандарта компилятором.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.