2

以下是我的问题的表示。

#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<_Ty> &)'时

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

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

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

4

1 回答 1

2

根据 boost 源代码,由于您没有为spsc_queue基类指定编译时容量,因此spsc_queue通过 typedefs 和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构造函数时尝试提供大小以及分配器。

于 2013-11-01T15:31:17.523 回答