Boost bimap 无法使用 gcc 10, c++20 编译。寻找临时解决方案

Boost bimap fails to compile with gcc 10, c++20. Looking for temporary fix

提问人:yoyoy 提问时间:6/6/2020 更新时间:6/6/2020 访问量:1245

问:

使用 gcc 10.1 和 boost 1.73.0,以下代码

#include <boost/bimap.hpp>

int main() {
  boost::bimap<int, int> lookup;
}

无法使用 flags 进行编译,但会成功使用 flags(使用 Compiler Explorer 验证)。-O2 --std=c++20-O2 -std=c++17

这可能与以下问题有关:https://github.com/boostorg/bimap/pull/15(已弃用std::allocator<void>)

我现在可以使用一些解决方法来使此代码成功编译?--std=c++20

C++ 提升 C++20 GCC10

评论

0赞 Basile Starynkevitch 6/6/2020
为什么不使用标准的 C++ 容器,例如两个耦合容器或?std::map<int,int>std::unordered_map<int,int>

答:

8赞 Piotr Skotnicki 6/6/2020 #1

错误背后的原因不是删除了专业化。实际上,它仍然作为带有参数的主要模板有效。代码无法编译,因为不再是其自身的一部分。相反,实现应使用 .std::allocator<void>void::rebindstd::allocatorstd::allocator_traits<Alloc>::rebind_alloc<U>

幸运的是,大多数容器通常允许将自定义分配器指定为模板参数。根据 docs 的说法,分配器可以是第三个、第四个或第五个模板参数。它默认为 ,但可以改用,这不会产生错误:boost::bimapstd::allocatorboost::container::allocator

#include <boost/bimap.hpp>
#include <boost/container/allocator.hpp>

int main() {
  boost::bimap<int, int, boost::container::allocator<int>> lookup;
}

问题最近在 6fba6e5 中已修复。 现在正确检测嵌套是否可用:boost::bimap::rebind

template<class A, class T, class = void>
struct allocator_rebind {
    typedef typename detail::alloc_to<A, T>::type type;
};

template<class A, class T>
struct allocator_rebind<A, T,
    typename detail::alloc_void<typename A::template rebind<T>::other>::type> {
    typedef typename A::template rebind<T>::other type;
};