Russian Qt Forum
Ноябрь 24, 2024, 02:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Шаблоны cpp  (Прочитано 4194 раз)
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« : Апрель 04, 2020, 22:50 »

Доброго времени суток.
Есть некоторое количество чужого кода, доставшегося по наследству. В нём 100500 функций, имеющие общий вид типа
Код:
int MegaClass::f0(void)
{
   XXX1 *t_data = reinterpret_cast<XXX1 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
int MegaClass::f1(void)
{
   XXX2 *t_data = reinterpret_cast<XXX2 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
...
int MegaClass::f100(void)
{
   XXX101 *t_data = reinterpret_cast<XXX101 *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
где XXX* - это union, а input - QByteArray
решил сделать шаблон, чтобы хотя бы укоротить код
Код:
template<typename T>
int MegaClass::template_f(T qq)
{
   qq *t_data = reinterpret_cast<qq *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}
и получил ошибку: error: ‘t_data’ was not declared in this scope
Как такой шаблон правильно написать?
Эмоции за сам подобный код прошу оставить в стороне, вопрос не про это.
Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Апрель 04, 2020, 23:10 »

У вас проблема в ку-ку:

Код:
template<typename T>
int MegaClass::template_f(void)
{
   T *t_data = reinterpret_cast<T *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}

ку-ку - это имя _переменной_ типа Т которую вы передаете в шаблон (в оригинальных функциях ничего не передавалось). Это не имя типа.
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #2 : Апрель 04, 2020, 23:18 »

У вас проблема в ку-ку:

Код:
template<typename T>
int MegaClass::template_f(void)
{
   T *t_data = reinterpret_cast<T *>(input.data());
   тут делаем определенные операции с этим t_data и возвращаем результат
   return t_data->res;
}

ку-ку - это имя _переменной_ типа Т которую вы передаете в шаблон (в оригинальных функциях ничего не передавалось). Это не имя типа.
Эээ... и как я потом в этот шаблон тип передам? Я ведь предполагал далее писать, что-то типа
Код:
 return template_f(XXX1); 
Просто "свернуть" функции, сделать их компактнее.
« Последнее редактирование: Апрель 04, 2020, 23:20 от tux » Записан

Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Апрель 04, 2020, 23:23 »

Теперь наоборот, вы передаете ТИП вместо переменной. "передача" типа в шаблон явно указывается в <>:
Код:
return template_f<XXX1>();

Возможность не указывать тип - это бонус и называется Template argument deduction:

Код:
int m1 = std::max(100, 200); // ОК
int m2 = std::max<int>(100, 200); // тоже ОК
double m3 = std::max<double>(100.5, 200); // а надо это для мест когда тип определить невозможно, первый double, а второй int
« Последнее редактирование: Апрель 04, 2020, 23:26 от Авварон » Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #4 : Апрель 04, 2020, 23:34 »

Мда. Век живи - век учись!
Спасибо!
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 23.