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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разрешение неоднозначности при перегрузке функций, как происходит поиск подходящей функции? 
V
    Опции темы
zim22
Дата 28.6.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Почему в случае функции print у нас нет неоднозности, в отличии от функции f1?
В функции print тип short, с помощью "продвижения" интегрального типа, был преобразован в тип int.
Почему же в функции f1 тип int не преобразовался в тип long int?
Код

void print(char);
void print(int);
short s = 6;
print(s); // "интегральное продвижение" - вызывается print(int)


Код

void f1(char);
void f1(long);
int i = 5;
f1(i);  // неоднозначность: f1(char) или f2(long)




Это сообщение отредактировал(а) zim22 - 28.6.2009, 14:07


--------------------
PM MAIL   Вверх
Riddik
Дата 28.6.2009, 14:19 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <iostream>
#include <typeinfo>
using namespace std;

void f1(int sim)
{
    cout<<typeid(sim).name()<<endl;
}

void f1(char sim)
{
    cout<<typeid(sim).name()<<endl;
}

int main()
{
    f1(33);
    f1('z');
    int i=5;   //i - это int, поэтому вызовется f1(int)
    f1(i);
    return 0;
}


Добавлено через 6 минут и 44 секунды
Не успел увидеть изменения в первом посте. (с int на long)

Во втором случае не скомпилируется - компилятор выдаст сообщение об ошибке, как раз о неодназначности перегруженных ф-ий.

Это сообщение отредактировал(а) Riddik - 28.6.2009, 14:21
PM MAIL   Вверх
zim22
Дата 28.6.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Riddik @  28.6.2009,  14:19 Найти цитируемый пост)
 cout<<typeid(sim).name()<<endl;

В данном случае нет смысла применять typeid. Он всегда будет возвращать тип параметра функции.

Цитата(Riddik @  28.6.2009,  14:19 Найти цитируемый пост)
Во втором случае не скомпилируется - компилятор выдаст сообщение об ошибке, как раз о неодназначности перегруженных ф-ий.

Вы констатируете факт. Мне же нужно объяснение этого факта.

Это сообщение отредактировал(а) zim22 - 28.6.2009, 14:39


--------------------
PM MAIL   Вверх
Riddik
Дата 28.6.2009, 14:48 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ступил, сорри.
Код

void f1(int sim) {cout<<"This is 'int'\n";}

void f1(char sim) {cout<<"This is 'char'\n";}


PM MAIL   Вверх
zim22
Дата 28.6.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Riddik, Вы издеваетесь, да? smile
Вы можете объяснить, почему компилятор справляется с неоднозначностью вызова в случае print и нет - в случае f1?

Это сообщение отредактировал(а) zim22 - 28.6.2009, 15:13


--------------------
PM MAIL   Вверх
Riddik
Дата 28.6.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня последние три дня приступы тупости, возможно после двух бессонных ночей. Приношу извенения за неадекватные ответы.


PM MAIL   Вверх
mes
Дата 28.6.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  28.6.2009,  14:12 Найти цитируемый пост)
почему компилятор справляется с неоднозначностью вызова в случае print и нет - в случае f1?

идет поиск наилучшего преобразования
для short между char и int  наилучшим будет int
для int между char и long лучшего нет.




--------------------
PM MAIL WWW   Вверх
zim22
Дата 28.6.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(mes @  28.6.2009,  16:36 Найти цитируемый пост)
для int между char и long лучшего нет.

как нет?
int to char - опасное преобразование
int to long int - безопасное. 
long int лучше! smile
***
"Страуструп"
По поводу размеров фундаментальных типов гарантируется следующее:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Это сообщение отредактировал(а) zim22 - 28.6.2009, 16:43


--------------------
PM MAIL   Вверх
Gordon
Дата 28.6.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mes, это ты правильно сказал... При переводе int хоть в long хоть в char мой компилятор не ругается, а вот при переводе short в char - выдает предупреждение! Другое дело почему?

Добавлено @ 16:43
zim22, по логике да, в long переводить лучше... Но между int и char какая-то особая "связь"... 

Это сообщение отредактировал(а) Gordon - 28.6.2009, 16:44


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 28.6.2009, 16:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Gordon @  28.6.2009,  16:42 Найти цитируемый пост)
 при переводе short в char - выдает предупреждение! Другое дело почему? 

предупреждение - потому что возможна потеря данных при преобразовании.


--------------------
PM MAIL   Вверх
mes
Дата 28.6.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  28.6.2009,  15:39 Найти цитируемый пост)
По поводу размеров фундаментальных типов гарантируется следующее:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Дело не в их размере, а в том что int особенный и в него позволено конвертировать другие интегральные типы, которые в него помещаются.
long является лучшим только  например для w_char_t при условии, что последний не помещается в int.

а вот например хоть short и вмещает  char, он не будет подходящим преобразованием.

сейчас в стандарте поищу..

Добавлено @ 16:50
Цитата

  4.5  Integral promotions                                   [conv.prom]

1 An  rvalue  of  type  char,  signed char, unsigned char, short int, or
  unsigned short int can be converted to an rvalue of type  int  if  int
  can represent all the values of the source type; otherwise, the source
  rvalue can be converted to an rvalue of type unsigned int.

2 An rvalue of type wchar_t (_basic.fundamental_) or an enumeration type
  (_dcl.enum_) can be converted to an rvalue of the first of the follow-
  ing types that can represent all the values of  its  underlying  type:
  int, unsigned int, long, or unsigned long.

3 An  rvalue for an integral bit-field (_class.bit_) can be converted to
  an rvalue of type int if int can represent all the values of the  bit-
  field;  otherwise, it can be converted to unsigned int if unsigned int
  can represent all the values of the bit-field.  If  the  bit-field  is
  larger yet, no integral promotion applies to it.  If the bit-field has
  an enumerated type, it is treated as any other value of that type  for
  promotion purposes.

4 An rvalue of type bool can be converted to an rvalue of type int, with
  false becoming zero and true becoming one.

5 These conversions are called integral promotions.



Это сообщение отредактировал(а) mes - 29.6.2009, 10:34


--------------------
PM MAIL WWW   Вверх
Gordon
Дата 28.6.2009, 16:51 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  28.6.2009,  16:44 Найти цитируемый пост)
предупреждение - потому что возможна потеря данных при преобразовании.


Понятное дело, так и должно быть! Ну так и int тоже по размеру больше чем char, а предупреждения нет... 


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 28.6.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Gordon @  28.6.2009,  16:51 Найти цитируемый пост)
а предупреждения нет... 

есть. нужно просто warning level: 4 поставить. по умолчанию он 3. smile
mes, спасибо smile

Это сообщение отредактировал(а) zim22 - 28.6.2009, 17:03


--------------------
PM MAIL   Вверх
Gordon
Дата 28.6.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  28.6.2009,  16:46 Найти цитируемый пост)
а вот например хоть short и вмещает  char, он не будет подходящим преобразованием.


У меня char->short без предупреждений проходит...  char занимает 1 байт, а short 2...

Добавлено через 5 минут и 32 секунды
zim22, может быть, но только на одном уровне (как ты говоришь - 3), в одном случае нет возмущения а в другом есть... Значит все равно какая-то тонкость есть... ???


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 28.6.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Gordon @  28.6.2009,  17:00 Найти цитируемый пост)
У меня char->short без предупреждений проходит...  char занимает 1 байт, а short 2...

где проходит? в перегруженных функциях? или в неявном конвертировании при передаче в качестве аргумента?


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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