我尝试定义自己的 boost::intrusive::slist
。
另外,我想在类中有另一个静态方法。 (copy_buffer_from_list
) 获取 list& 和 iterator& 作为参数。
问题是有些定义是循环的,我无法正确理解。
这是当前代码:
#include <boost/intrusive/slist.hpp>
typedef boost::intrusive::slist_base_hook<> InputBufferSglHook;
class InputBufferSglNode;
// list
typedef boost::intrusive::slist<InputBufferSglNode, boost::intrusive::cache_last<true>> InputBufferSglList;
typedef InputBufferSglList::iterator InputBufferSglIterator;
class InputBufferSglNode : public InputBufferSglHook
{
public :
InputBufferSglNode(const void* buffer, size_t size);
~InputBufferSglNode() {};
// copy 'size_t' bytes from list to target, if list doesn't have enough space, method shall return false
static bool copy_buffer_from_list(InputBufferSglList &list, InputBufferSglIterator &iter, size_t &offset_in_node, const InputBufferSglIterator& end, uint8_t *target, size_t size);
void reset();
public:
const void *m_buffer;
size_t m_size;
};
// empty list
const InputBufferSglList s_EMPTY_INPUT_BUFF_SGL = InputBufferSglList();
InputBufferSglNode::InputBufferSglNode(const void* buffer, size_t size) :
InputBufferSglHook(),
m_buffer(buffer),
m_size(size)
{
// empty
}
void InputBufferSglNode::reset()
{
m_buffer = nullptr;
m_size = 0;
}
static bool InputBufferSglNode::copy_buffer_from_list(InputBufferSglList &list, InputBufferSglIterator &iter, size_t &offset_in_node, const InputBufferSglIterator& end, uint8_t *target, size_t size)
{
// implementation
}
请注意,我尝试转发声明 InputBufferSglNode
但在编译时出现以下错误:
error: incomplete type 'InputBufferSglNode' named in nested name specifier
note: in instantiation of template class 'boost::intrusive::slist<InputBufferSglNode, boost::intrusive::cache_last<true>, void, void, void, void>' requested here
typedef InputBufferSglList::iterator InputBufferSglIterator;
^
note: forward declaration of 'InputBufferSglNode'
class InputBufferSglNode;
^
最佳答案
如其所说,类型不完整。这是不合法的(侵入式容器需要在实例化时知道实现细节——基础、大小等)。
文档特别提到在进行这种“嵌套”使用时应避免推导钩子(Hook)类型。
鉴于此,有几种方法可以修复它:
你可以随意调整: Live On Coliru .
如果你真的想让
InputBufferSglList
成为一个全局的 typedef,当然,你可以只给它起个别名: Live On Coliru更新 对于评论,您似乎真的坚持要将其设为前向声明的列表类型,并且您可以,如此处所述in the documentation :
typedef boost::intrusive::slist_base_hook<> InputBufferSglHook; class InputBufferSglNode; // list typedef boost::intrusive::slist< InputBufferSglNode, boost::intrusive::base_hook<InputBufferSglHook>, boost::intrusive::cache_last<true> > InputBufferSglList; typedef InputBufferSglList::iterator InputBufferSglIterator;
工作完成。见<强>Live On Coliru 也是。
完整演示
完整的第三个版本,供以后引用:
#include <boost/intrusive/slist.hpp>
typedef boost::intrusive::slist_base_hook<> InputBufferSglHook;
class InputBufferSglNode;
// list
typedef boost::intrusive::slist<
InputBufferSglNode,
boost::intrusive::base_hook<InputBufferSglHook>,
boost::intrusive::cache_last<true>
> InputBufferSglList;
typedef InputBufferSglList::iterator InputBufferSglIterator;
class InputBufferSglNode : public InputBufferSglHook
{
public:
InputBufferSglNode(const void* buffer, size_t size);
~InputBufferSglNode() {};
// copy 'size_t' bytes from list to target, if list doesn't have enough space, method shall return false
static bool copy_buffer_from_list(InputBufferSglList &list, InputBufferSglIterator &iter, size_t &offset_in_node, const InputBufferSglIterator& end, uint8_t *target, size_t size);
void reset();
public:
const void *m_buffer;
size_t m_size;
};
// empty list
const InputBufferSglList s_EMPTY_INPUT_BUFF_SGL = InputBufferSglList();
InputBufferSglNode::InputBufferSglNode(const void* buffer, size_t size) :
InputBufferSglHook(),
m_buffer(buffer),
m_size(size)
{
// empty
}
void InputBufferSglNode::reset()
{
m_buffer = nullptr;
m_size = 0;
}
bool InputBufferSglNode::copy_buffer_from_list(InputBufferSglList &list, InputBufferSglIterator &iter, size_t &offset_in_node, const InputBufferSglIterator& end, uint8_t *target, size_t size)
{
// implementation
}
int main() {
}
关于c++ - 错误 : incomplete type 'typename' named in nested name specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27087278/