【问题标题】:boost::object_pool::construct() in visual c++视觉c++中的boost::object_pool::construct()
【发布时间】:2011-12-11 11:46:27
【问题描述】:

在 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创建类?

【问题讨论】:

    标签: c++ visual-studio visual-c++ boost


    【解决方案1】:
    A* pa = pool.construct(1, 2); // 在此处设置所需的值

    根据 Boost 文档:object_pool

    t.construct(???),返回 ElementType*。 ElementType 必须有一个构造函数匹配???。

    AFAIK,这个魔法最多支持 4 个参数。

    【讨论】:

      【解决方案2】:

      要使用 object_pool 分配对象并将参数传递给它们的构造函数,请使用它的 construct 方法而不是它的 malloc 方法,如 @alex-f 所示。在你的情况下:

      A* pa = pool.construct(1, 2);  // The parameters are passed to A's constructor
      

      问题在于,尽管boost::pool 库仅是标头,因此不需要构建本身,但需要声明和定义construct 方法以接受任意多个参数。由于使用最多接受 100 个参数的 construct 方法声明发送 boost::pool 会使标头过长并减慢编译速度,因此他们选择的解决方案似乎是需要运行一次性脚本 boost/pool/detail/pool_construct{_simple}.{sh,bat} 来生成construct 定义支持但需要许多参数。在boost::pool 以包的形式提供的Linux 发行版上,该脚本已为您运行。在 Windows 上或使用存储库中的库时,如果您不运行脚本,则构造方法将根本不可用。

      pool_construct{_simple} 脚本需要一个名为 m4 的预处理器引擎。我发现在 Windows 上运行 pool_construct{_simple} 脚本的最简单方法是使用从 WSL 运行 bash 并运行:

      sudo apt install m4
      ./boost_dir/boost/pool/detail/pool_construct_simple.sh 10
      

      当然,如果您的构造函数接受超过 10 个参数,您可以更改参数。运行上面的命令会创建一个bool/pool/detail/pool_construct_simple.ipp,然后boost::pool 的常规包含文件将获得对construct 方法的支持。

      运行非简单的pool_construct 脚本会创建定义,使得每个参数都是常规的constvolatileconst volatile。所以对于 10 个参数,有 4^10 种方法可以编写需要 10 个参数。这会导致脚本运行很长时间,使用大量内存,并生成一个 ~700MB pool_construct.ipp 文件。我发现我的项目的定义方式,巨大的文件甚至没有使construct 方法可用于我的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多