VS2019, C++17, специализация std::swap
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 16.01.20 07:49
Оценка:
Есть без проблем компилируемый код

namespace std{

template<>
inline void swap(ole_lib::TConnectData2& x1,ole_lib::TConnectData2& x2)
{
 x1.swap(x2);
}//swap

}//nms std


Который перестал компилироваться, когда я в настройках проекта (VS2019) указал С++17.

Error C2912 explicit specialization 'void std::swap<ole_lib::TConnectData2>(ole_lib::TConnectData2 &,ole_lib::TConnectData2 &)' is not a specialization of a function template


Я полез в <utility>, а там со swap какая-та дичь

template <class _Ty, class>
void swap(_Ty& _Left, _Ty& _Right) noexcept(is_nothrow_move_constructible_v<_Ty>&& is_nothrow_move_assignable_v<_Ty>) {
    _Ty _Tmp = _STD move(_Left);
    _Left    = _STD move(_Right);
    _Right   = _STD move(_Tmp);
}


А что это за второй неименованный аргумент у шаблона?

---
А как теперь правильно определять специализацию для std::swap?

Может я и раньше неправильно её определял?

---
Я так понимаю что

namespace std{

inline void swap(ole_lib::TConnectData2& x1,ole_lib::TConnectData2& x2)
{
 x1.swap(x2);
}//swap

}//nms std


это не специализация, а перегрузка функции, которая будет вызываться для классов, производных от ole_lib::TConnectData2 — а мне такое не надо... я правильно понимаю?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.