Boost сам по себе является целой экосистемой, нацеленной на минимизацию зависимости от стандартной библиотеки C ++ (помните, что std::swap
доступен только с C ++ 11). Таким образом, существует boost::swap()
, который имеет перегрузки для всех типов данных Boost, включая boost::unordered_set
:
// swap
template<typename Value, typename Hash, typename Pred, typename Alloc>
void swap(unordered_set<Value, Hash, Pred, Alloc>&,
unordered_set<Value, Hash, Pred, Alloc>&);
Если вы используете std::swap
, тогда вам следует рассмотреть std::unordered_set
, и наоборот, если вы не можете или не хотите этого делать, вам следует все время придерживаться Boost. Попробуйте свести к минимуму смешивание std
и boost
.
Что касается ошибки - похоже, это ошибка в стандартной библиотеке MSVC; реализация std::swap<vector>
явно не ограничена vector
s, что неверно, поскольку происходит сбой всякий раз, когда тип указан явно.
Это выглядит примерно так:
template<class T>
class _Vb_reference
{
using _Alvbase = typename T::_Alloc;
};
template<class T>
void swap(_Vb_reference<T> _Left, _Vb_reference<T> _Right)
{
}
Это работает только тогда, когда аргументы выводятся , как в
std::swap(toto, tutu); // _Vb_reference<T> is non-deduced context
Но происходит сбой, когда тип указан явно:
std::swap<index_list_type>(toto, tutu); // instantiation of _Vb_reference<index_list_type> fails = hard error
Лучшая реализация включала бы некоторые SFINAE, чтобы ограничить шаблон типами _Vb_reference<T>
.