将boost :: lockfree :: spsc_queue与分配器一起使用

时间:2013-11-01 15:00:19

标签: c++ boost

以下是我的问题的表示。

#include <boost/lockfree/spsc_queue.hpp>

class test {
  struct complicated {
    int x;
    int y;   
  };
  std::allocator<complicated> alloc;
  boost::lockfree::spsc_queue<complicated, 
    boost::lockfree::allocator<std::allocator<complicated> > > spsc;
  test(void);

}; 

test::test(void): spsc( alloc ) {};

使用此代码,我在VS2010中出现以下错误:

错误C2512:'boost :: lockfree :: detail :: runtime_sized_ringbuffer':没有合适的默认构造函数

编译类模板成员函数'boost :: lockfree :: spsc_queue :: spsc_queue(const std :: allocator&lt; _Ty&gt;&amp;)'

错误消息表明它正在编译带有一个参数的构造函数,我认为它应该是分配器,但主要错误是关于默认构造函数。

文档的起点位于http://www.boost.org/doc/libs/1_54_0/doc/html/lockfree.html

使用boost :: lockfree :: allocator定义boost :: lockfree :: spsc_queue的适当机制是什么?

1 个答案:

答案 0 :(得分:2)

根据boost源代码,由于您没有为spsc_queue指定编译时容量,spsc_queue的基类通过typedef和模板魔法解析为runtime_sized_ringbuffer有以下构造函数:

explicit runtime_sized_ringbuffer(size_t max_elements);

template <typename U>
runtime_sized_ringbuffer(typename Alloc::template rebind<U>::other const & alloc, size_t max_elements);

runtime_sized_ringbuffer(Alloc const & alloc, size_t max_elements);

如您所见,所有这些构造函数都需要max_element参数。提供这种方法的唯一方法是使用以下spsc_queue构造函数之一:

explicit spsc_queue(size_type element_count):
    base_type(element_count)
{
    BOOST_ASSERT(runtime_sized);
}

template <typename U>
spsc_queue(size_type element_count, typename allocator::template rebind<U>::other const & alloc):
    base_type(alloc, element_count)
{
    BOOST_STATIC_ASSERT(runtime_sized);
}

spsc_queue(size_type element_count, allocator_arg const & alloc):
    base_type(alloc, element_count)
{
    BOOST_ASSERT(runtime_sized);
}

换句话说,在调用spsc_queue构造函数时,尝试提供一个大小以及分配器。