gpt4 book ai didi

c++ - Boost 快速池分配器有函数指针问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:18 26 4
gpt4 key购买 nike

这是 Boost 错误还是我做错了什么?

#include <map>
#include <boost/pool/pool_alloc.hpp>

int main()
{
typedef const std::string key;
typedef double* (*value)(const int&);
std::map<key, value, std::less<key>> map_with_standard_allocator; // works
std::map<key, value, std::less<key>, boost::fast_pool_allocator<std::pair<const key, value> > > map_with_boost_allocator; // fails
}

最后一行无法在带有 Boost 1.40 和 1.48 的 MS Visual Studio 2008 下编译。不过,它在 g++ 4.5.3 (Cygwin) 下编译得很好。

错误是:

1>Compiling...
1>main.cpp
1>C:\UniLib1\trunk\External\boost/pool/pool_alloc.hpp(205) : error C2535: 'const std::basic_string<_Elem,_Traits,_Ax> *boost::fast_pool_allocator<T,UserAllocator,Mutex,NextSize>::address(const std::basic_string<_Elem,_Traits,_Ax> &)' : member function already defined or declared
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>,
1> T=const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
1> UserAllocator=boost::default_user_allocator_new_delete,
1> Mutex=boost::details::pool::default_mutex,
1> NextSize=32
1> ]
1> C:\UniLib1\trunk\External\boost/pool/pool_alloc.hpp(202) : see declaration of 'boost::fast_pool_allocator<T,UserAllocator,Mutex,NextSize>::address'
1> with
1> [
1> T=const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
1> UserAllocator=boost::default_user_allocator_new_delete,
1> Mutex=boost::details::pool::default_mutex,
1> NextSize=32
1> ]
1> c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xtree(137) : see reference to class template instantiation 'boost::fast_pool_allocator<T,UserAllocator,Mutex,NextSize>' being compiled
1> with
1> [
1> T=const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,
1> UserAllocator=boost::default_user_allocator_new_delete,
1> Mutex=boost::details::pool::default_mutex,
1> NextSize=32
1> ]
1> c:\Program Files\Microsoft Visual Studio 9.0\VC\include\map(78) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
1> with
1> [
1> _Traits=std::_Tmap_traits<key,value ,std::less<key>,boost::fast_pool_allocator<std::pair<key,value >>,false>
1> ]
1> .\main.cpp(9) : see reference to class template instantiation 'std::map<_Kty,_Ty,_Pr,_Alloc>' being compiled
1> with
1> [
1> _Kty=key,
1> _Ty=value,
1> _Pr=std::less<key>,
1> _Alloc=boost::fast_pool_allocator<std::pair<key,value >>
1> ]

最佳答案

这不是 VS2008 中的错误(正如我在此答案的早期编辑中错误声称的那样)。 C++03 标准要求关联容器的键类型,如 std::map ,必须是“可分配的”(根据 23.1.2“关联容器”中的表 69)。还有一个 const std::string不可分配。请注意,C++11 标准似乎放宽了这一要求,但自 VC++ 2008 以来,新标准不再适用。

我不清楚是否需要编译器来诊断尝试使用 std::map 的代码使用不可分配的 key ,所以我不认为有人可以声称 GCC 或 VC++ 2010 不正确地接受此代码(我认为它属于未定义代码的区域,可以按您预期的方式工作,即使不能保证它会工作)。不过很明显,VC++ 2008拒绝编译也没关系。

综上所述,我认为 VC++ 2008 的库参数化了分配器的 address() map 键而不是 map 元素上的功能仍然值得怀疑(如果您有兴趣,请参阅此答案的第一次编辑了解详细信息),但我认为自 std::pair<> 以来没有任何真正的错误。用于保存 map 元素的设置将始终使关键部分与整个元素位于同一地址。

关于c++ - Boost 快速池分配器有函数指针问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10498911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com