Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Игра в С++


Автор: Fazil6 13.7.2007, 20:14
Код

template<class T>
void test(T &a, T &b)
{
    printf("\nTEST 1\n");
}
//=========================
void test(char *a, char *b)
{
    printf("\nTEST 2\n");
}
//=========================
void main()
{    

    test("Июнь","Июль");
    test("Август", "Сентябрь");
}


Как Вы думаете,
что компилятор выберет для вызова.

Автор: zkv 13.7.2007, 20:26
Цитата(Fazil6 @  13.7.2007,  20:14 Найти цитируемый пост)
что компилятор выберет для вызова.

думаю, что это:
void test(char *a, char *b)
{
    printf("\nTEST 2\n");
}

тк из этого: "Июнь" ссылку не сделаешь

Автор: Daevaorn 13.7.2007, 20:28
Цитата(zkv @  13.7.2007,  21:26 Найти цитируемый пост)
тк из этого: "Июнь" ссылку не сделаешь 

smile
я за шаблонную!

Автор: Fazil6 13.7.2007, 20:31
Цитата(zkv @  13.7.2007,  20:26 Найти цитируемый пост)
думаю, что это:


Цитата(Daevaorn @  13.7.2007,  20:28 Найти цитируемый пост)
я за шаблонную!

 smile 
вот... Это уже интереснее.... Имеем разные мнения...

Кто-нибудь еще что-нибудь предложит?

Автор: Melancholic 13.7.2007, 21:22
Казалось бы никак не void test(char *a, char *b). Ибо проинициализировать char* значением типа const char* нельзя. А ссылка на const char* это кажется вполне естественным.

Автор: nickless 13.7.2007, 21:22
Мдя, думал компилятор ругнётся на переобъявление функции, попробовал - не ругнулся, но результат выдал очень неожиданный... smile 
Жду решения smile 

Автор: Fazil6 13.7.2007, 21:26
Цитата(nickless @  13.7.2007,  21:22 Найти цитируемый пост)
но результат выдал очень неожиданный... 

а какой компиллятор? smile 

Автор: zkv 13.7.2007, 21:28
Цитата(Melancholic @  13.7.2007,  21:22 Найти цитируемый пост)
Ибо проинициализировать char* значением типа const char* нельзя.

скажешь, что это:
Код

void f( char *x )
{
}
int main()
{
    f( "очень даже компильнем :)" );
}

не откомпилится?

Автор: nickless 13.7.2007, 21:28
Цитата(Fazil6 @  13.7.2007,  20:26 Найти цитируемый пост)
а какой компиллятор? 

gcc 4.1.2

П.С. Понял почему не ругнулся smile 


Автор: Melancholic 13.7.2007, 21:42
Цитата

не откомпилится?

Простите, сморозил. Тип строкового литерала есть const char[]

Автор: bsa 13.7.2007, 21:43
Ужас! Тоже хочу знать почему ТАК!!!  smile 
Никогда бы не догадался... Такие задачки надо давать тем, кому надо отказать в приеме на работу... Имхо.

Автор: Fazil6 13.7.2007, 21:49
Цитата(bsa @  13.7.2007,  21:43 Найти цитируемый пост)
Ужас! Тоже хочу знать почему ТАК!!!

ответ очень прост. 
Подумайте немного...
Полпути уже пройдено.
Какой у тебя компилятор?

Автор: 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
Цитата(nickless @  13.7.2007,  22:01 Найти цитируемый пост)
потом на втором вызове не генерит код шблонной ибо уже есть, и берёт первую попавшуюся функцию под именем test, т.е. test(char*, char*) 

попробуй:
#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, 
 smile интересная теория, но неправильная.  

Автор: bsa 13.7.2007, 22:10
Цитата(Fazil6 @ 13.7.2007,  21:49)
Какой у тебя компилятор?

Код
iccbin (ICC) 9.1 20070320
Copyright (C) 1985-2007 Intel Corporation.  All rights reserved.


Код
g++ (GCC) 4.1.2 (Gentoo 4.1.2)
Copyright (C) 2006 Free Software Foundation, Inc.


и еще mingw.
У всех результат один.

Похоже, nickless прав.

Добавлено через 41 секунду
Цитата(Fazil6 @ 13.7.2007,  22:09)
nickless, 
 smile интересная теория, но неправильная.

Кончай темнить! Признавайся!

Автор: Fazil6 13.7.2007, 22:14
Цитата

Кончай темнить! Признавайся!

zkv почти все рассказал уже тока что

Автор: bsa 13.7.2007, 22:25
так. кое что начинает проясняться. тип вызываемой функции зависит от длины строки. Если длина строки равна размеру указателя (в моем случае 8 байт - кодировка UTF8 на amd64) то вызывается шаблонная, в противном случае нешаблонная. Правильно?

Автор: nickless 13.7.2007, 22:30
zkv,  smile 
Даааа...
Похоже если строки одинаковой длины, тип получается const char[] и вызывается шаблонная, а если разной, const char * и вызывыется нормальная smile 

Автор: Fazil6 13.7.2007, 22:45
Цитата(bsa @  13.7.2007,  22:25 Найти цитируемый пост)
Правильно?

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

А если вспомнить, что тип строкового литерала совсем не  указатель, а массив, то для вызова нешаблона нужно преобразование, причем сначала к указателю на const, а потом просто к char* поэтому при разрешении перегрузки она непривелигирована, а при разной длине шаблон вообще нипричем так как типы аргументов разные


Автор: JackYF 13.7.2007, 23:15
Ууу.... удивился. Капец.

А вообще, если я когда-нибудь сделаю такую перегрузку не в целях полахать, то стена меня ждет. Либо от себя (позже), либо от коллег.

Автор: Fazil6 13.7.2007, 23:27
Цитата(JackYF @  13.7.2007,  23:15 Найти цитируемый пост)
А вообще, если я когда-нибудь сделаю такую перегрузку

ну это сильно притянутый за уши пример. 

попробуйте 
Код

void test(const char*, const char*)

вместо
Код

void test(char*, char*)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)