Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Должен ли быть возвращаемый тип явной спецыалезацыи и самого шаблона одинаковыми

18K
06 августа 2007 года
Avenger
25 / / 23.02.2007
Всем привет!
Возможно ли имея такой шаблон:

[FONT="System"]template<typename T>
T func(const T* arr, int k);[/FONT]

описать спецыализацию которая получает в качестве первого аргумента масив указателей и должна возвращать адрес елемента (пускай ето будет масив указателей на тип char)
Пробывал писать следушчие:

[FONT="System"]template<typename T>
T func(const T* arr, int k);

template <> char* func<char*>(const char** arr, int k);[/FONT] но компилятор ругаетса :confused:
9.7K
06 августа 2007 года
DaemonDZK
59 / / 08.11.2005
Так все работает:

 
Код:
typedef char* char_ptr;
template<typename T> T func(const T* arr, int k);
template <> char_ptr func<char_ptr>(const char_ptr* arr, int k)
{
    return arr[0];
}


но все же я бы этого делать не стал :).
18K
06 августа 2007 года
Avenger
25 / / 23.02.2007
спасибо! а вообще что косаетса вопроса должны ли типы быть одинаковыми?
9.7K
06 августа 2007 года
DaemonDZK
59 / / 08.11.2005
Цитата: Avenger
спасибо! а вообще что косаетса вопроса должны ли типы быть одинаковыми?



Гм. не совсем понял что ты имеешь ввиду, использовать в шаблонах в любом виде возможно любой из производных типов от типа параметра. Но это не всегда 1. читаемо, 2. безопастно.

18K
06 августа 2007 года
Avenger
25 / / 23.02.2007
ты меня не понял я имею ввиду , ну вот смотры я выделил типы ы меня ынтересуэт должны ли они быть оденаковыми?
typedef char* char_ptr;
template<typename T>
T func(const T* arr, int k);
template <> char_ptr func<char_ptr>(const char_ptr* arr, int k) { return arr[0]; } или я могу писать и так:

typedef char* char_ptr;
template<typename T>
T func(const T* arr, int k);
template <> int func<char_ptr>(const char_ptr* arr, int k) { return arr[0]; }:confused:
9.7K
06 августа 2007 года
DaemonDZK
59 / / 08.11.2005
Конечно должны, Т в твоем случае параметр шаблона, когда ты конкретизируешь шаблон ты должен параметр заменить на один конкретный тип.
18K
06 августа 2007 года
Avenger
25 / / 23.02.2007
так в том и вопрос ! посмотри на второй код я же только возвращаемый тип заменил на int а а первий аргумент в функции оставил старым точнее char_ptr можно ли так делать?
9.7K
06 августа 2007 года
DaemonDZK
59 / / 08.11.2005
нет нельзя
18K
06 августа 2007 года
Avenger
25 / / 23.02.2007
ечо раз спасибо;)
3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Avenger
Всем привет!
Возможно ли имея такой шаблон:

[FONT="System"]template<typename T>
T func(const T* arr, int k);[/FONT]

описать спецыализацию которая получает в качестве первого аргумента масив указателей и должна возвращать адрес елемента (пускай ето будет масив указателей на тип char)
Пробывал писать следушчие:

[FONT="System"]template<typename T>
T func(const T* arr, int k);

template <> char* func<char*>(const char** arr, int k);[/FONT] но компилятор ругаетса :confused:



Вся проблема в const. Он у тебя делает константным не тот тип.
Правильно должно быть так:

 
Код:
template<>
char* func<char*>(char* const* arr, int k);
18K
07 августа 2007 года
Avenger
25 / / 23.02.2007
Цитата: Green
Вся проблема в const. Он у тебя делает константным не тот тип.
Правильно должно быть так:
 
Код:
template<>
char* func<char*>(char* const* arr, int k);



незнаю у меня почемуто не работает:
[FONT="System"]error C2447: missing function header (old-style formal list?)[/FONT]
определение вродь верно записано:
[FONT="System"]template <> char* func <char *>( char* const *arr, int k);
{
char *p=arr[0];
for(int i=0; i<k; i++)
if (strlen(p)<strlen(arr)) p=arr;

return p;
} [/FONT]но ругаетса именно здесь

350
08 августа 2007 года
cheburator
589 / / 01.06.2006
template <> char* func <char *>( char* const *arr, int k)[color=red];[/color] // Лишняя точка с запятой
{
char *p=arr[0];
for(int i=0; i<k; i++)
if (strlen(p)<strlen(arr)) p=arr;

return p;
} но руг
18K
08 августа 2007 года
Avenger
25 / / 23.02.2007
спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог