Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2009, 17:56   #1
Locode
 
Регистрация: 26.03.2009
Сообщений: 7
Восклицание Не компилируется! *WALL*

Ребят, есть небольшая программка. Кто может сказать почему она не комплируется. Не кидайтесь камнями сразу, читать сообщения компилятора я умею) Но по стандарту вроде не должно быть никакой неоднозначности, 1 должна привестись к типу дабл, а затем должна вызваться прегруженная операция + для комплексного+вещественного. Разве не так?

Код:
#include <iostream>
using namespace std;

class Complex
{
	double re;
	double im;
public:
	Complex()
	{
		re=0;
		im=0;
	}
	Complex(double x, double y)
	{
		re=x;
		im=y;
	}

	Complex operator+(const Complex &x)
	{
		Complex temp;
		temp.re=re+x.re;
		temp.im=im+x.im;
		return temp;
	}
	
	operator double() 
	{
		return re*im;
	}

	friend Complex operator+(Complex x, double y);
};

Complex operator+(Complex x, double y)
{
	Complex temp;
	temp.re=x.re+y;
	temp.im=x.im;
	return temp;
}

int main()
{
	Complex x(2,3);
	double a(5);

	a=x+1;
	cout<<a<<endl;
}

Последний раз редактировалось MaTBeu; 26.03.2009 в 18:18.
Locode вне форума Ответить с цитированием
Старый 26.03.2009, 18:27   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

На сколько я понимаю, переменная a у вас типа double. Функция operator+ возвращает значение типа Complex. Получается не соответствие типов
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 26.03.2009, 18:27   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

не ручаюсь за правильность, но по-моему нужно добавить библиотеку математ. функций.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 26.03.2009, 18:29   #4
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

А что конкретно компилятор-то пишет?
Pashan вне форума Ответить с цитированием
Старый 26.03.2009, 18:34   #5
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Sweta Посмотреть сообщение
не ручаюсь за правильность, но по-моему нужно добавить библиотеку математ. функций.
Зачем? Тут нет библиотечных функций
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 26.03.2009, 18:49   #6
Locode
 
Регистрация: 26.03.2009
Сообщений: 7
По умолчанию

Компилятор пишет:

ex1.cpp: In function ‘int main()’:
ex1.cpp:49: ошибка: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
ex1.cpp:36: замечание: кандидат 1: Complex operator+(Complex, double)
ex1.cpp:49: замечание: кандидат 2: operator+(double, int) <built-in>
Locode вне форума Ответить с цитированием
Старый 26.03.2009, 18:52   #7
Locode
 
Регистрация: 26.03.2009
Сообщений: 7
По умолчанию

Насколько я знаю по стандарту при подборе подходящей функции из перегруженных действуют следующие правила:

• Если существует перегруженная функция, типы формальных параметров которой в точности совпадают с типами фактических параметров, выбирается эта функция.
• Иначе если существует единственная перегруженная функция такая, что типы можно согласовать только с помощью стандартных преобразований, выбирается эта функция. Если подобных функций несколько, компилятор диагностирует ошибку.
• Иначе если существует единственная перегруженная функция такая, что типы фактических параметров приводимы к типам формальных параметров, выбирается эта функция. Если подобных функций несколько, компилятор диагностирует ошибку.
• Если ни один из вышеперечисленных вариантов не удовлетворяет, диагностируется ошибка.

Нам как раз вроде 2 пункт подходит. Соответственно прога должна вывести число 9.
Но она почему-то ругается (
Locode вне форума Ответить с цитированием
Старый 26.03.2009, 19:59   #8
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Нам как раз вроде 2 пункт подходит. Соответственно прога должна вывести число 9.
Вы не объяснили компилятору, что надо делать в этой строке:
a=x+1;
То ли преобразовывать x к double и складывать double с int, то ли преобразовывать 1 к double и складывать Complex и double. Компилятор в недоумении.
Замените 1 на 1.0 и программа выведет 9.
still_alive вне форума Ответить с цитированием
Старый 26.03.2009, 20:03   #9
Locode
 
Регистрация: 26.03.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Вы не объяснили компилятору, что надо делать в этой строке:
a=x+1;
То ли преобразовывать x к double и складывать double с int, то ли преобразовывать 1 к double и складывать Complex и double. Компилятор в недоумении.
Замените 1 на 1.0 и программа выведет 9.
Вопрос как раз в этом! Разве по стандарту в этом случае компилятор не должен выбрать вариант с преобразованием x к double?

Это понятно что если заменить 1 на 1.0 получится 9 ) Вопрос не в получении результата, а в осмыслении действий компилятора.
Locode вне форума Ответить с цитированием
Старый 26.03.2009, 20:54   #10
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Это относится к тем вещам, где каждый компилятор действует так, как виделась ситуация его создателям.

Стандарт языка и компилятор - совершенно разные понятия. Кстати, одним из самых приближенных к стандарту плюсов считается старый (98 года вроде) вижуаловский...

Например, майкрософтовский компилятор ругается на следующий код:
Код:
for(int i=0;i<100;i++){
    cout << i << endl;
}

int i; // здесь компилятор говорит, что переменная уже объявлена
Я очень удивился, когда узнал...
Начиная с 2005 студии так делать можно...
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не компилируется модуль Лубышев Помощь студентам 6 11.03.2013 15:40
Не компилируется COM файл Veselyn Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 19.03.2009 12:35
Не компилируется программа kiloruble Общие вопросы C/C++ 11 17.11.2008 20:51
Не компилируется программа VladimirVB Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.10.2008 23:22
Не компилируется исходник steck Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 32 30.07.2007 11:55