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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Специализация шаблонного метода  (Прочитано 25673 раз)
kramer
Гость
« Ответ #30 : Февраль 19, 2016, 21:21 »

Мне кажется в нашем случае перегрузка и срабатывает, а не частичная специализация.

Вот это:
Код
C++ (Qt)
template<int Size, typename T>
bool operator ==( const TVector<Size, T> &, const TVector<Size, T> & )
{
cout << "operator== for T" << endl;
return false;
}
 
template<int Size>
bool operator ==( const TVector<Size, double> &, const TVector<Size, double> & )
{
cout << "operator== for double" << endl;
return false;
}
 
есть частичная специализация. Полная была бы
Код
C++ (Qt)
template<>
bool operator ==( const TVector<1, double> &, const TVector<1, double> & ) {...}
 

VS2013 ваш код не соберет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Февраль 19, 2016, 21:26 »

Для функций это
TVector<Size, T>
и
TVector<Size, double>
может считаться разными типами.
Поэтому происходит обычная перегрузка и никаких частичных специализаций.

А VC2013 может еще много чего не собирать. Это пусть его пользователи беспокоятся. Улыбающийся
К тому же, напомню, последний VC не считает это расширением.
« Последнее редактирование: Февраль 19, 2016, 21:29 от Old » Записан
kramer
Гость
« Ответ #32 : Февраль 19, 2016, 21:35 »

Для функций это
А VC2013 может еще много чего не собирать. Это пусть его пользователи беспокоятся. Улыбающийся
Компилятор топикстартера это тоже не соберет. См. ответы за номером два и три, в этой ветке.
Предложение сменить компилятор (операционную систему, архитектуру, планету, физику) я полагаю флудом.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Февраль 19, 2016, 21:37 »

Компилятор топикстартера это тоже не соберет. См. ответы за номером два и три, в этой ветке.
А я сейчас больше не про компиляторы, а про C++.
Записан
kramer
Гость
« Ответ #34 : Февраль 19, 2016, 21:48 »

А я сейчас больше не про компиляторы, а про C++.
Частичная специализация шаблонных функций отсутствует в стандарте, а в вашем коде присутствует. То что вы делаете над бедным оператором == и называется частичной специализацией. Как выглядит полная, я написал выше, а уж коль скоро вы один параметр оставляете шаблонным - она частичная. Так что, это не С++.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Февраль 19, 2016, 21:54 »

Если у функции разные параметры это перегрузка. Значит это С++.
Компиляторы, уже даже самый тормозной vc, не считают это расширением, значит это С++.

Но спорить больше не буду, если все компиляторы и так это поддерживают, то не имеет значение как это называется.
« Последнее редактирование: Февраль 19, 2016, 21:57 от Old » Записан
kramer
Гость
« Ответ #36 : Февраль 19, 2016, 21:59 »

Если у функции разные параметры это перегрузка. Значит это С++.
Компиляторы, уже даже самый тормозной vc, не считают это расширением, значит это С++.
Перегрузка функций присутствовала в С++ с самого начала. А в вашем коде помимо нее есть еще и частичная специализация. А значит, ваш код - не на С++, потому как частичная специализация шаблонных функций не входит в стандарт. Избавьтесь от нее - тогда будет C++.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Февраль 19, 2016, 22:00 »

Перегрузка функций присутствовала в С++ с самого начала. А в вашем коде помимо нее есть еще и частичная специализация. А значит, ваш код - не на С++, потому как частичная специализация шаблонных функций не входит в стандарт. Избавьтесь от нее - тогда будет C++.
Не может там быть перегрузки и частичной специализации одновременно.

Но спорить больше не буду, если все компиляторы и так это поддерживают, то не имеет значение как это называется.
Уже стандарт.
« Последнее редактирование: Февраль 19, 2016, 22:04 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #38 : Февраль 19, 2016, 22:03 »

Ну уж частичная специализация для класса точно будет везде работать)
Код
C++ (Qt)
template<class T>
struct compare_helper
{
   static bool compare(const T& x, const T& y)
   {
       return x == y;
   }
};
 
template<>
struct compare_helper<double>
{
   static bool compare(const double& x, const double & y)
   {
       return qFuzzyCompare(x, y);
   }
};
 
template <size_t Size, class T>
bool operator==(const TVector<Size, T> & x, const TVector<Size, T> & y)
{
   return std::equal(x.begin(), x.end(), y.begin(), compare_helper<T>::compare);
}
 

И то, что привёл old - это не частичная специализация, а скорее перегрузка.
Частичная специализация функции выглядела бы как то так  
Код
C++ (Qt)
template <class T>
void func(T) { ... }
 
template<>
void func<double>(double) { ... }
 
Но стандарт для функций это не поддерживает, как известно)
« Последнее редактирование: Февраль 19, 2016, 22:06 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #39 : Февраль 19, 2016, 22:07 »

И то, что привёл old - это не частичная специализация, а скорее перегрузка.
Справедливости ради, это вы предложили данное решение. Я лишь решил проверить его на убогом VC и как оказалось они наконец его починили. Улыбающийся
Записан
kramer
Гость
« Ответ #40 : Февраль 19, 2016, 22:08 »

Но спорить больше не буду, если все компиляторы и так это поддерживают, то не имеет значение как это называется.
Безусловно, не имеет. Только компилятор топикстартера это не поддерживает, т.е. в данном топике, я так полагаю, это имеет значение.

Уже стандарт.
Цитату, будьте любезны.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #41 : Февраль 19, 2016, 22:11 »

Цитату, будьте любезны.
По праву большинства. Стандарт это договоренность между разработчиками компиляторов и если все из них что-то реализуют одинаково, то совершенно не важно написано это где-то или нет.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Февраль 19, 2016, 22:18 »

Ну уж частичная специализация для класса точно будет везде работать)
Это мне больше нравится, чем решение ViTech.
Опять же как там vc с этим справится... Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #43 : Февраль 19, 2016, 22:24 »

Цитировать
Опять же как там vc с этим справится..
От этого, самого строгого, всемо можно ожидать)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
kramer
Гость
« Ответ #44 : Февраль 19, 2016, 22:24 »

Справедливости ради, это вы предложили данное решение. Я лишь решил проверить его на убогом VC и как оказалось они наконец его починили. Улыбающийся
Нет, не надо ля-ля. Мое решение не использует частичную специализацию, да и специализацию вообще. Кроме того, это не мое решение, а пользователя ViTech, я всего лишь код накидал.

Кроме прочего, насчет убогости VC я с вами согласен. Недавно ужасно глупый баг в VC2012 нашел. Но тут такое дело - плюешься, но надо. Компиляторы на переправе не меняют.

По праву большинства. Стандарт это договоренность между разработчиками компиляторов и если все из них что-то реализуют одинаково, то совершенно не важно написано это где-то или нет.
Стандарт - это документ. Страниц на семьсот. В последнем принятом c++14 нет ни слова о частичной специализации шаблонных функций.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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