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];
}
Должен ли быть возвращаемый тип явной спецыалезацыи и самого шаблона одинаковыми
Возможно ли имея такой шаблон:
[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:
Код:
но все же я бы этого делать не стал :).
спасибо! а вообще что косаетса вопроса должны ли типы быть одинаковыми?
Цитата: Avenger
спасибо! а вообще что косаетса вопроса должны ли типы быть одинаковыми?
Гм. не совсем понял что ты имеешь ввиду, использовать в шаблонах в любом виде возможно любой из производных типов от типа параметра. Но это не всегда 1. читаемо, 2. безопастно.
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:
Конечно должны, Т в твоем случае параметр шаблона, когда ты конкретизируешь шаблон ты должен параметр заменить на один конкретный тип.
так в том и вопрос ! посмотри на второй код я же только возвращаемый тип заменил на int а а первий аргумент в функции оставил старым точнее char_ptr можно ли так делать?
нет нельзя
ечо раз спасибо;)
Цитата: 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:
Возможно ли имея такой шаблон:
[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);
char* func<char*>(char* const* arr, int k);
Цитата: Green
Вся проблема в const. Он у тебя делает константным не тот тип.
Правильно должно быть так:
Правильно должно быть так:
Код:
template<>
char* func<char*>(char* const* arr, int k);
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]но ругаетса именно здесь
{
char *p=arr[0];
for(int i=0; i<k; i++)
if (strlen(p)<strlen(arr)) p=arr;
return p;
} но руг
спасибо