c++ - 错误 : incomplete type 'typename' named in nested name specifier

标签 c++ c++11 boost

我尝试定义自己的 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)类型。

鉴于此,有几种方法可以修复它:

  1. 你可以随意调整: Live On Coliru .

  2. 如果你真的想让 InputBufferSglList 成为一个全局的 typedef,当然,你可以只给它起个别名: Live On Coliru

  3. 更新 对于评论,您似乎真的坚持要将其设为前向声明的列表类型,并且您可以,如此处所述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/

相关文章:

c++ - 全局变量和范围 - C++

c++ - 在 map C++ 中按字典顺序排序

c++ - 当 auto 用于数组时,为什么它被转换为指针而不是引用?

c++ - 元组中返回的对象的 std::tie 和生命周期

c++ - DirectInput 未解析的外部符号

c++ - gcc 内联 asm x86 CPU 标志作为输入依赖项

c++ - 除法和乘法 std::chrono::durations

c++ - boost asio无法识别计时器对象

c++ - 是否允许递归 boost spirit 语法?

c++ - 使用 boost::spirit::x3 编译错误