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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Специализация шаблона, Ошибки компиляции при специализации. 
V
    Опции темы
Pulse69
Дата 6.11.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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




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



Это сообщение отредактировал(а) Pulse69 - 6.11.2007, 13:54
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Lazin
Дата 6.11.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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

get_fill_char();

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

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


Это сообщение отредактировал(а) Lazin - 6.11.2007, 14:28
PM MAIL Skype GTalk   Вверх
Alek86
Дата 6.11.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



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

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


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

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

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



--------------------
user posted image    user posted image
PM MAIL   Вверх
Pulse69
Дата 6.11.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


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

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


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

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Lazin
Дата 6.11.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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

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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



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


--------------------
user posted image    user posted image
PM MAIL   Вверх
Pulse69
Дата 7.11.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


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

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Dims
Дата 9.11.2007, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А что делают пустые угловые скобки?
PM MAIL   Вверх
JackYF
Дата 9.11.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



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

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

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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