【发布时间】:2014-12-11 08:11:42
【问题描述】:
编辑:
澄清我想要的结果,因为我没有很好地传达它:
为了能够使用std::allocate_shared 和boost::fast_pool_allocator 作为分配方法,使用g++ 4.8 或更高版本和boost 1.56.0。目前这适用于 g++ 4.6,但在 4.7、4.8 和 4.9 上失败。
明确地说,我不希望为 g++4.7 提供这项工作。
测试代码产生错误:
#include "boost/pool/pool.hpp"
#include "boost/pool/pool_alloc.hpp"
#include <memory>
int main(int argc, char** argv)
{
auto fails = std::allocate_shared<int>( boost::fast_pool_allocator<int>() );
auto works = std::allocate_shared<int>(boost::fast_pool_allocator<int>(), 5);
}
在我们的代码库中,我们将 std::allocate_shared 与提升池分配器结合使用,这会导致一些令人讨厌的编译错误。然而,这已经在不同版本的 g++ 中发生了变化:
详细信息:64 位,(4.7,4.8) -std=c++11,(4.6) -std=c++0x,boost 1.56.0
4.6 - 编译愉快
4.7 - 使编译器崩溃
内部编译器错误:重新输入错误报告例程。请 提交完整的错误报告,并在适当的情况下提供预处理的源代码。看 获取说明。 预处理后的源码存放在 /tmp/cca0Emq9.out 文件中,请附上 这是你的错误报告。
4.8 - 严重的编译错误
/XXXXXXXXXX/boost/boost/pool/pool_alloc.hpp:399:错误:使用已删除的函数'std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2u>::_Sp_counted_ptr_inplace(const std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2u>&)’ { 新 (ptr) T(t); } ^
/usr/include/c++/4.8/bits/shared_ptr_base.h:198:错误: 'std::_Sp_counted_base<_lp>::_Sp_counted_base(const std::_Sp_counted_base<_lp>&) [with __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’ 是私有的 _Sp_counted_base(_Sp_counted_base const&) = 删除; ^ /usr/include/c++/4.8/bits/shared_ptr_base.h:379:错误:在这个 语境 _Sp_counted_ptr_inplace 类最终:公共 _Sp_counted_base<_lp> ^
/usr/include/c++/4.8/bits/shared_ptr_base.h:379:错误:使用已删除 函数‘std::_Sp_counted_base<_lp>::_Sp_counted_base(const std::_Sp_counted_base<_lp>&) [with __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]'
/usr/include/c++/4.8/bits/shared_ptr_base.h:198:错误:在此声明 _Sp_counted_base(_Sp_counted_base const&) = 删除; ^
4.9 - 严重的编译错误(略有不同)
/XXXXXXXXXXX/boost/boost/pool/pool_alloc.hpp:399:错误:使用 删除函数‘std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2u>::_Sp_counted_ptr_inplace(const std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2u>&)’ { 新 (ptr) T(t); } ^
/usr/include/c++/4.9/bits/shared_ptr_base.h:203:错误: 'std::_Sp_counted_base<_lp>::_Sp_counted_base(const std::_Sp_counted_base<_lp>&) [with __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’ 是私有的 _Sp_counted_base(_Sp_counted_base const&) = 删除; ^
/usr/include/c++/4.9/bits/shared_ptr_base.h:494:错误:在此 语境 _Sp_counted_ptr_inplace 类最终:公共 _Sp_counted_base<_lp> ^
/usr/include/c++/4.9/bits/shared_ptr_base.h:494:错误:使用已删除 函数‘std::_Sp_counted_base<_lp>::_Sp_counted_base(const std::_Sp_counted_base<_lp>&) [with __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’
我花了很多钱 时间试图深入了解这一点,我会提供一些帮助 如果有人更熟悉内部工作原理,将不胜感激 这些组件。
【问题讨论】:
-
内部编译器错误是总是向供应商报告的错误,所以对此无能为力。
-
我有一种预感,这与其说是编译器的变化,不如说是标准库的变化。
-
正如@Sehe 所建议的,这是标准库实现而不是编译器的问题。我已经在 (GCC) 5.0.0 20141022 (experimental) 中尝试过了,它可以编译。
-
我必须承认我很困惑你甚至在一个明显与编译器错误有关的问题上悬赏。如果您想询问解决方法,您可以相应地编辑问题吗?
-
在 g++ 4.8.3
auto fails = std::allocate_shared<int>( std::allocator<int>());上不会失败,因此 boost 必须使用 4.7 中尚未实现的东西。
标签: c++ c++11 boost compiler-errors g++