| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Игра в С++ |
| Автор: Fazil6 13.7.2007, 20:14 | ||
Как Вы думаете, что компилятор выберет для вызова. |
| Автор: zkv 13.7.2007, 20:26 |
думаю, что это: void test(char *a, char *b) { printf("\nTEST 2\n"); } тк из этого: "Июнь" ссылку не сделаешь |
| Автор: Daevaorn 13.7.2007, 20:28 |
я за шаблонную! |
| Автор: Fazil6 13.7.2007, 20:31 |
вот... Это уже интереснее.... Имеем разные мнения... Кто-нибудь еще что-нибудь предложит? |
| Автор: Melancholic 13.7.2007, 21:22 |
| Казалось бы никак не void test(char *a, char *b). Ибо проинициализировать char* значением типа const char* нельзя. А ссылка на const char* это кажется вполне естественным. |
| Автор: nickless 13.7.2007, 21:22 |
| Мдя, думал компилятор ругнётся на переобъявление функции, попробовал - не ругнулся, но результат выдал очень неожиданный... Жду решения |
| Автор: Fazil6 13.7.2007, 21:26 |
а какой компиллятор? |
| Автор: nickless 13.7.2007, 21:28 |
gcc 4.1.2 П.С. Понял почему не ругнулся |
| Автор: Melancholic 13.7.2007, 21:42 | ||
Простите, сморозил. Тип строкового литерала есть const char[] |
| Автор: bsa 13.7.2007, 21:43 |
| Ужас! Тоже хочу знать почему ТАК!!! Никогда бы не догадался... Такие задачки надо давать тем, кому надо отказать в приеме на работу... Имхо. |
| Автор: Fazil6 13.7.2007, 21:49 |
ответ очень прост. Подумайте немного... Полпути уже пройдено. Какой у тебя компилятор? |
| Автор: nickless 13.7.2007, 22:01 |
| Моё имхо почему: компилятор генерит код для нормальной test() потом встретив первый вызов test() компилятор генерит шаблонную test(const char*, const char*) и вызывает её потом на втором вызове не генерит код шблонной ибо уже есть, и берёт первую попавшуюся функцию под именем test, т.е. test(char*, char*) Добавлено через 1 минуту и 17 секунд Но блин, не дай бог дебажить программу пол ночи изза этого... |
| Автор: zkv 13.7.2007, 22:05 | ||
попробуй: #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 13.7.2007, 22:09 |
| nickless, |
| Автор: bsa 13.7.2007, 22:10 | ||||||||
и еще mingw. У всех результат один. Похоже, nickless прав. Добавлено через 41 секунду
Кончай темнить! Признавайся! |
| Автор: Fazil6 13.7.2007, 22:14 | ||
zkv почти все рассказал уже тока что |
| Автор: bsa 13.7.2007, 22:25 |
| так. кое что начинает проясняться. тип вызываемой функции зависит от длины строки. Если длина строки равна размеру указателя (в моем случае 8 байт - кодировка UTF8 на amd64) то вызывается шаблонная, в противном случае нешаблонная. Правильно? |
| Автор: nickless 13.7.2007, 22:30 |
| zkv, Даааа... Похоже если строки одинаковой длины, тип получается const char[] и вызывается шаблонная, а если разной, const char * и вызывыется нормальная |
| Автор: Fazil6 13.7.2007, 22:45 |
нет. Все очень просто. Вопервых. Для того, чтобы шаблонная функция участвовала в перегрузке оба параметра должны быть одинакового типа. Во вторых при выборе между шаблоном и нешаблоном, нешаблон имеет приоритет если не нужны приведения. А если вспомнить, что тип строкового литерала совсем не указатель, а массив, то для вызова нешаблона нужно преобразование, причем сначала к указателю на const, а потом просто к char* поэтому при разрешении перегрузки она непривелигирована, а при разной длине шаблон вообще нипричем так как типы аргументов разные |
| Автор: JackYF 13.7.2007, 23:15 |
| Ууу.... удивился. Капец. А вообще, если я когда-нибудь сделаю такую перегрузку не в целях полахать, то стена меня ждет. Либо от себя (позже), либо от коллег. |
| Автор: Fazil6 13.7.2007, 23:27 | ||||
ну это сильно притянутый за уши пример. попробуйте
вместо
|