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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Специализация шаблона с расширением std и разделением объявления и реализации  (Прочитано 4811 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Ноябрь 15, 2016, 07:36 »

Привет, друзья!
Прошу помочь с вопросом, как мне реализовать сабдж? Предлагаю выполнить на примере std::swap.
Пробовал через
Код
C++ (Qt)
namespace std {
template<> void swap(MyClass &, MyClass &);
}
В gcc всё работает, а clang выдаёт ошибку. Как будет правильно по стандарту выполнить специализацию?
Записан
m_ax
Джедай : наставник для всех
*******
Online Online

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Ноябрь 15, 2016, 08:21 »

Цитировать
В gcc всё работает, а clang выдаёт ошибку. Как будет правильно по стандарту выполнить специализацию?
Наверное так:
Код
C++ (Qt)
namespace std {
template<> void swap<MyClass>(MyClass &, MyClass &);
}
 
Записан

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

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

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Ноябрь 15, 2016, 09:21 »

Ещё noexcept просит.
https://godbolt.org/g/lUOqDe
Почему-то в моём проекте не требуется noexcept, а при его наличии выдаёт ошибку.
Почему может так разниться? Использую c++14
Записан
m_ax
Джедай : наставник для всех
*******
Online Online

Сообщений: 2095



Просмотр профиля
« Ответ #3 : Ноябрь 15, 2016, 11:49 »

Цитировать
Ещё noexcept просит.
Ну так дайте)
Код
C++ (Qt)
namespace std{
 template<> void swap<MyClass>(MyClass &, MyClass &) noexcept(noexcept(
   std::is_nothrow_move_constructible<MyClass>::value &&
   std::is_nothrow_move_assignable<MyClass>::value
));
}
 
Записан

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

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

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Ноябрь 15, 2016, 12:08 »

Дык дал Улыбающийся
Не понимаю, почему разнится способ реализации. Как правильно делать специализацию по стандарту?
Записан
schmidt
Гость
« Ответ #5 : Январь 08, 2017, 19:35 »

Привет, друзья!
Прошу помочь с вопросом, как мне реализовать сабдж? Предлагаю выполнить на примере std::swap.
Пробовал через
Код
C++ (Qt)
namespace std {
template<> void swap(MyClass &, MyClass &);
}
В gcc всё работает, а clang выдаёт ошибку. Как будет правильно по стандарту выполнить специализацию?

Эмм... что у вас там работает - неясно, ничего работать не должно  Смеющийся Объявление и реализация шаблонного класса в принципе стиснута рамками одного header-файла. Прежде чем специализировать шаблонный класс компилятору требуется его полное определение. Я в свое время тоже маялся этой манией написать короткое чистенькое объявление класса в .h, а детали, как полагается вынести в .cpp, но все закончилось бесконечными ошибками компиляции. И только позже из документации/книг по шаблонам узнал, что компилятор не ползает по разным файлам в поисках частей одного и того же шаблона.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Январь 09, 2017, 13:24 »

Прежде чем специализировать шаблонный класс компилятору требуется его полное определение. Я в свое время тоже маялся этой манией написать короткое чистенькое объявление класса в .h, а детали, как полагается вынести в .cpp, но все закончилось бесконечными ошибками компиляции. И только позже из документации/книг по шаблонам узнал, что компилятор не ползает по разным файлам в поисках частей одного и того же шаблона.
Речь идёт не о шаблонном классе, а о шаблонной функции. Вы уверены, что для специализации требуется полное определение?
Ничто мешает отделять объявление от определения функции внутри одного h файла. Также ничто не мешает выносить определения в отдельный h файл и инклудить его после объявлений.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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