Russian Qt Forum

Программирование => С/C++ => Тема начата: __Heaven__ от Ноябрь 15, 2016, 07:36



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


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


Название: Re: Специализация шаблона с расширением std и разделением объявления и реализации
Отправлено: __Heaven__ от Ноябрь 15, 2016, 09:21
Ещё noexcept просит.
https://godbolt.org/g/lUOqDe (https://godbolt.org/g/lUOqDe)
Почему-то в моём проекте не требуется noexcept, а при его наличии выдаёт ошибку.
Почему может так разниться? Использую c++14


Название: Re: Специализация шаблона с расширением std и разделением объявления и реализации
Отправлено: m_ax от Ноябрь 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
));
}
 


Название: Re: Специализация шаблона с расширением std и разделением объявления и реализации
Отправлено: __Heaven__ от Ноябрь 15, 2016, 12:08
Дык дал :)
Не понимаю, почему разнится способ реализации. Как правильно делать специализацию по стандарту?


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

Эмм... что у вас там работает - неясно, ничего работать не должно  ;D Объявление и реализация шаблонного класса в принципе стиснута рамками одного header-файла. Прежде чем специализировать шаблонный класс компилятору требуется его полное определение. Я в свое время тоже маялся этой манией написать короткое чистенькое объявление класса в .h, а детали, как полагается вынести в .cpp, но все закончилось бесконечными ошибками компиляции. И только позже из документации/книг по шаблонам узнал, что компилятор не ползает по разным файлам в поисках частей одного и того же шаблона.


Название: Re: Специализация шаблона с расширением std и разделением объявления и реализации
Отправлено: __Heaven__ от Январь 09, 2017, 13:24
Прежде чем специализировать шаблонный класс компилятору требуется его полное определение. Я в свое время тоже маялся этой манией написать короткое чистенькое объявление класса в .h, а детали, как полагается вынести в .cpp, но все закончилось бесконечными ошибками компиляции. И только позже из документации/книг по шаблонам узнал, что компилятор не ползает по разным файлам в поисках частей одного и того же шаблона.
Речь идёт не о шаблонном классе, а о шаблонной функции. Вы уверены, что для специализации требуется полное определение?
Ничто мешает отделять объявление от определения функции внутри одного h файла. Также ничто не мешает выносить определения в отдельный h файл и инклудить его после объявлений.