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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Специализация шаблонного метода нешаблонного класса [решено]  (Прочитано 5554 раз)
Alp
Гость
« : Сентябрь 02, 2009, 14:57 »

Забыл про эти шаблоны вообще последнее что помнил. Как бы решить подобную задачку попроще?

Код
C++ (Qt)
struct A
{
 char array[256];
 
 template<typename T> T Blend(T*source, int step)
 {
   T result;
   /*doing something with array, source and step and storing in result */
   return (T)floor(result); //Here the difference!!!
 }
 
 template<> double Blend<double>(double*source, int step)
 {
   double result;
   /*doing something with array, source and step and storing in result */
   return result; //Here the difference!!!
 }
};
 

Разумеется, при сборке gcc 3.4.5 получаю:
P:\projects>gcc 2.cpp
2.cpp:12: error: explicit specialization in non-namespace scope `struct A'
2.cpp:13: error: template-id `Blend<double>' for `double Blend(double*, int)' does not match any template declaration
2.cpp:13: error: invalid function declaration

Можно ли вообще по стандарту реализовывать подобную специализацию, и если да - то в чем я ошибаюсь, а если нет - как попроще можно сделать подоный трюк?
« Последнее редактирование: Сентябрь 02, 2009, 15:38 от Alp » Записан
Rcus
Гость
« Ответ #1 : Сентябрь 02, 2009, 15:29 »

/* shrugs */ В данном случае самый простой вариант это вынести метод из класса. Специализация возможна только для свободных функций или целых классов. Точнее можно оставить шаблонный метод в классе который будет вызывать шаблонную свободную функцию.
« Последнее редактирование: Сентябрь 02, 2009, 15:35 от Rcus » Записан
Alp
Гость
« Ответ #2 : Сентябрь 02, 2009, 15:37 »

Кажется нашел ответ. При поиске наиболее подходящего шаблона (вроде бы это называется "поиск Кёнига") наиболее подходящей оказывается вообще нешаблонизированная функция/метод

Код
C++ (Qt)
struct A
{
 char array[256];
 
 template<typename T> T Blend(T*source, int step)
 {
   std::cout << "Using template method" << std::endl;
 }
 
 double Blend(double*source, int step)
 {
   std::cout << "Using specialized for 'double'  method" << std::endl;
 }
};
 
int main()
{
   A a;
 
   int i = 0,  s = 1;
   a.Blend<int>(&i, s);
 
   double d0 = 1;
   a.Blend(&d0, s);
 
   return 0;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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