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


Автор: Pulse69 6.11.2007, 13:51
Всем привет! Вот возник такой интересный вопрос:
Если возвращаемое значение в функции сделать шаблонным, а потом написать специализацию этой функции, компилятор отказывается принимать такую конструкцию.
Например, так
Код

template <class CharType> CharType get_fill_char()
{
    //...sumthin'
}
template<> CharType get_fill_char<char>()
{
   return '0';
}




Справедливо для MSVC. 
Сознаюсь, особо нет времени копаться в стандарте, так что может ли кто-нибудь разъяснить мне почему этого нельзя сделать?


Автор: Lazin 6.11.2007, 14:27
Все правильно, перегружать возвращаемое значение нельзя.
что компилятор должен делать если ты где нибудь в программе сделаешь так
Код

get_fill_char();

К тому-же правильнее писать так:
Код

template<> char get_fill_char()
{
   return '0';
}

Автор: Alek86 6.11.2007, 14:30
Цитата(Pulse69 @  6.11.2007,  13:51 Найти цитируемый пост)
Код

template<> CharType get_fill_char<char>(){
    return '0';
}


компилятор, по-видимому не понимает, что такое CharType

а я не помню, как оно правильно пишется.... вроде
Код

template<>
char get_fill_char(){
    return '0';
}

Автор: Pulse69 6.11.2007, 14:42
Цитата(Lazin @  6.11.2007,  22:27 Найти цитируемый пост)
Все правильно, перегружать возвращаемое значение нельзя.

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


Цитата(Lazin @  6.11.2007,  22:27 Найти цитируемый пост)
К тому-же правильнее писать так:

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


Alek86, так же спасибо за участие!

Автор: Lazin 6.11.2007, 15:05
Цитата(Pulse69 @  6.11.2007,  14:42 Найти цитируемый пост)
Вообще-то, я полагал, что перегрузка функций и специализация шаблонов - немного разные вещи.

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

Автор: Alek86 6.11.2007, 16:18
Lazin, по этому поводу хорошо написано у Майерса или Рихтера (я их путаю...)

Автор: Pulse69 7.11.2007, 00:42
Цитата(Lazin @  6.11.2007,  23:05 Найти цитируемый пост)
Представь что у тебя такой шаблон используется с разными типами, 

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

char       fc    = get_fill_char()<char>();
wchar_t wfc = get_fill_char()<wchar_t>();
// ....


Вот примерно это мне и надо было.
Ещё раз всем спасибо!

Автор: Dims 9.11.2007, 03:53
А что делают пустые угловые скобки?

Автор: JackYF 9.11.2007, 13:28
Цитата(Dims @  9.11.2007,  03:53 Найти цитируемый пост)
А что делают пустые угловые скобки? 

Указывают на то, что дальше будет специализация шаблонов. И не обязательно пустые, достаточно указать не все парамтры шаблона.

Далее курить стандарт.  smile 

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