的std ::的unique_ptr 不完全类型错误(std::unique_ptr i

2019-09-16 23:26发布

我有

template<typename T>
class queue
{
private:
    struct node
    {
        T data;
        std::unique_ptr<node> next; //compile error on incomplete type

        node(T&& data_):
            data(std::move(data_))
        {}
    };

    std::unique_ptr<node> head;
    node* tail;

public:
        queue():
            tail(nullptr)
        {}

我得到的VS10标线编译错误。 我不应该被允许使用在这种情况下,一个不完整的类型(实例化模板 - 构造 - 这里INT为例)? 是否有变通?

编辑

singlethreadedqueue.h(62): error C2079: 'queue<T>::node::next' uses undefined class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              T=MyClass
1>          ]
1>          and
1>          [
1>              _Ty=queue<MyClass>::node
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\memory(2161) : see reference to class template instantiation 'queue<T>::node' being compiled
1>          with
1>          [
1>              T=MyClass
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\memory(2195) : see reference to class template instantiation 'std::_Unique_ptr_base<_Ty,_Dx,_Empty_deleter>' being compiled
1>          with
1>          [
1>              _Ty=queue<MyClass>::node,
1>              _Dx=std::default_delete<queue<MyClass>::node>,
1>              _Empty_deleter=true
1>          ]
1>         singlethreadedqueue.h(69) : see reference to class template instantiation 'std::unique_ptr<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=queue<MyClass>::node
1>          ]
1> : see reference to class template instantiation 'queue<T>' being compiled
1>          with
1>          [
1>              T=MyClass
1>          ]

Answer 1:

在模板实例点完全型的要求是由于std::default_delete ,所以也许你可以工作,围绕它通过提供一个定制删除。

struct node;         // node_delete need to know 'node' is a type.
struct node_deleter 
{                    // std::unique_ptr needs 'node_deleter' to be complete.
    void operator()(node* ptr);  // forward-reference to avoid needing
};                               //  'delete ptr' before the node is complete.

struct node
{
    std::unique_ptr<node, node_deleter> next;
};

void node_deleter::operator()(node* ptr)
{
     delete ptr;
}

你要知道,我还没有在MSVC测试它,可能是你应该尝试升级到VC 11,或提交错误微软如果连VC 11无法编译原码。



Answer 2:

你的代码看起来良好的。 在一个构造体和析构函数体,一个类被认为是一个完整的类型。



Answer 3:

如果您使用shared_ptr代替unique_ptr ,那么这个编译(VS2010上)。 我猜,它的实现方式允许的情况下,部分类(向前声明等) shared_ptr ,但不是unique_ptr 。 对于文档boost::shared_ptr肯定说,它允许这一点,但我不知道VS2010,如果它是“说”他们为什么这样做,这行为一个不是其他。

我想说的测试,看看它是否符合您的需求shared_ptr 。 这不是你想要的,但如果它的工作原理,以及速度差的不是很多,那么它可能是确定。



文章来源: std::unique_ptr incomplete type error