以下是我的问题的表示。
#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的适当机制是什么?
答案 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
构造函数时,尝试提供一个大小以及分配器。