在vc2008上使用boost 1.47(x86)
#include<boost/pool/object_pool.hpp>
class A
{
private:
friend class boost::object_pool<A>; //to prevent alloc other ways (ex> new A;)
A(int a, int b){ aa = a; bb = b}
int aa;
int bb;
};
void main()
{
boost::object_pool<A> pool;
A* pa = pool.construct(); //error "No appropriate default constructor available"
}
默认构造函数不存在,如何使用 boost :: object_pool 创建类?
答案 0 :(得分:0)
A* pa = pool.construct(1, 2); // set required values here
根据Boost文档:object_pool
t.construct(???),返回ElementType *。 ElementType必须具有匹配???的构造函数。
AFAIK,这种魔法支持最多4个参数。
答案 1 :(得分:0)
要使用object_pool分配对象并将参数传递给其构造函数,请使用其construct
方法而不是其malloc
方法,如@ alex-f所示。就您而言:
A* pa = pool.construct(1, 2); // The parameters are passed to A's constructor
问题在于,尽管boost::pool
库仅是标头,因此本身不需要构建,但是construct
方法需要声明和定义为接受任意多个参数。由于使用boost::pool
的方法声明附带construct
来接受最多100个参数会使标头过长并减慢了编译速度,因此他们选择的解决方案似乎是一次性脚本boost/pool/detail/pool_construct{_simple}.{sh,bat}
需要运行以生成construct
定义,这些定义支持许多参数。在boost::pool
作为软件包可用的Linux发行版中,该脚本已为您运行。在Windows上或使用存储库中的库时,如果不运行脚本,则完全无法使用Construct方法。
pool_construct{_simple}
脚本需要一个名为m4
的预处理器引擎。我发现在Windows上运行pool_construct{_simple}
脚本的最简单方法是从WSL运行bash
并运行:
sudo apt install m4
./boost_dir/boost/pool/detail/pool_construct_simple.sh 10
如果您的构造函数使用make而不是10个参数,那么您当然可以更改参数。运行上面的命令将创建一个bool/pool/detail/pool_construct_simple.ipp
,然后boost::pool
的常规包含文件将获得对construct
方法的支持。
运行非简单的pool_construct
脚本会创建定义,以使每个参数都是常规的const
,volatile
或const volatile
。因此,对于10个参数,有4 ^ 10个方法需要10个参数来编写。这将导致脚本长时间运行,使用大量内存并生成一个约700MB的pool_construct.ipp
文件。我发现,在定义项目的方式中,巨大的文件甚至没有使construct
方法可用于我的代码。