![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
Как Вы думаете, что компилятор выберет для вызова. |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| Melancholic |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.5.2007 Репутация: нет Всего: нет |
Казалось бы никак не void test(char *a, char *b). Ибо проинициализировать char* значением типа const char* нельзя. А ссылка на const char* это кажется вполне естественным.
|
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Мдя, думал компилятор ругнётся на переобъявление функции, попробовал - не ругнулся, но результат выдал очень неожиданный...
Жду решения -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Melancholic |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.5.2007 Репутация: нет Всего: нет |
Простите, сморозил. Тип строкового литерала есть const char[] |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ужас! Тоже хочу знать почему ТАК!!!
Никогда бы не догадался... Такие задачки надо давать тем, кому надо отказать в приеме на работу... Имхо. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Моё имхо почему:
компилятор генерит код для нормальной test() потом встретив первый вызов test() компилятор генерит шаблонную test(const char*, const char*) и вызывает её потом на втором вызове не генерит код шблонной ибо уже есть, и берёт первую попавшуюся функцию под именем test, т.е. test(char*, char*) Добавлено через 1 минуту и 17 секунд Но блин, не дай бог дебажить программу пол ночи изза этого... -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
попробуй: #include <iostream> template<class T> void test(T &a, T &b) { std::cout << typeid( a ).name()<<"\t"; printf("TEST 1\n\n"); } //========================= void test(char *a, char *b) { std::cout << typeid( a ).name()<<"\t"; printf("TEST 2\n\n"); } //========================= void main() { test("Июнь","Июль"); test("Август", "Сентябрь"); test("Июнь1","Июль"); test("Авгу", "Сент"); std::cin.get(); } |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
nickless,
|
|||
|
||||
| bsa |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
и еще mingw. У всех результат один. Похоже, nickless прав. Добавлено через 41 секунду
Кончай темнить! Признавайся! |
||||||||
|
|||||||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
zkv почти все рассказал уже тока что Это сообщение отредактировал(а) Fazil6 - 13.7.2007, 22:14 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
так. кое что начинает проясняться. тип вызываемой функции зависит от длины строки. Если длина строки равна размеру указателя (в моем случае 8 байт - кодировка UTF8 на amd64) то вызывается шаблонная, в противном случае нешаблонная. Правильно?
|
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
zkv,
Даааа... Похоже если строки одинаковой длины, тип получается const char[] и вызывается шаблонная, а если разной, const char * и вызывыется нормальная Это сообщение отредактировал(а) nickless - 13.7.2007, 22:33 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
нет. Все очень просто. Вопервых. Для того, чтобы шаблонная функция участвовала в перегрузке оба параметра должны быть одинакового типа. Во вторых при выборе между шаблоном и нешаблоном, нешаблон имеет приоритет если не нужны приведения. А если вспомнить, что тип строкового литерала совсем не указатель, а массив, то для вызова нешаблона нужно преобразование, причем сначала к указателю на const, а потом просто к char* поэтому при разрешении перегрузки она непривелигирована, а при разной длине шаблон вообще нипричем так как типы аргументов разные Это сообщение отредактировал(а) Fazil6 - 13.7.2007, 22:52 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Ууу.... удивился. Капец.
А вообще, если я когда-нибудь сделаю такую перегрузку не в целях полахать, то стена меня ждет. Либо от себя (позже), либо от коллег. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |