Несовместимость между std :: swap boost :: unordered_set и std :: vector? - PullRequest
0 голосов
/ 18 апреля 2019

что-то не так с std :: swap и boost :: unordered_set?

У меня возникают проблемы при использовании std :: swap и boost :: unordered_set.Следующий код генерирует ошибку C2039 на VC2017 / VC2019.Прокомментируйте строку #include, и она отлично работает.Кто-нибудь имеет какое-либо представление об этой проблеме?

#include <vector>
#include <boost/unordered/unordered_set.hpp>
typedef boost::unordered_set<size_t> index_list_type;
int main()
{
    index_list_type toto;
    index_list_type tutu;
    std::swap<index_list_type>(toto, tutu);
    return 0;
}

MSVC \ 14.20.27508 \ include \ vector (1702): ошибка C2039: '_Alloc': не является членом 'boost :: unordered_set, std :: equal_to, std ::распределитель> '

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

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>.

0 голосов
/ 30 апреля 2019

Вы должны просто использовать std :: unordered_set, нет необходимости в boost. Boost не должен работать с алгоритмами std. Отметьте здесь , в частности, «все стандартные контейнеры специализируют его таким образом, что вместо всего их содержимого заменяется только несколько внутренних указателей, что позволяет им работать в постоянном времени». часть.

Конечно, многие вещи могут быть взаимно совместимы между boost и std, но если все нужные вам инструменты доступны в одном и том же пространстве имен, просто используйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...