我可以实例化一个模板化对象A <B>,其中包含A <B>类型的对象的双端队列?

Ant*_*nio 8 c++ llvm

我想了解以下代码是否正确,或者不是:

#include <deque>

template<class T>
struct Node {
    std::deque<Node<T> > branches;
    T data;

    Node(const T& _data) : data(_data) {
    }

};

void dummy() {
    Node<float> test(5.0f);
}
Run Code Online (Sandbox Code Playgroud)

此代码使用多个工具链编译而不会产生错误(请参阅此处).问题是,现在我得到一个实例化错误(可能与我使用llvm libc ++,不确定版本的事实有关).

<...>llvm-libc++/include/deque:912:55: error: invalid application of 'sizeof' to incomplete type 'std::__1::__deque_base<Node<float>, std::__    1::allocator<Node<float> > >::value_type {aka Node<float>}'
     static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
Run Code Online (Sandbox Code Playgroud)

如果这段代码是正确的,我不想调查bug的起源(编译器或std库实现)或有一个解决方法:再次,我主要想了解上面的代码是否正式正确.

Bar*_*rry 16

代码格式不正确.在此刻:

template<class T>
struct Node {
    std::deque<Node<T> > branches; // <==
Run Code Online (Sandbox Code Playgroud)

Node<T>仍然是一个不完整的类型.目前有三个容器的不完整类型的内置异常:

  • " 如果分配器满足分配器完整性要求17.6.3.5.1.T实例化forward_list时,可以使用不完整类型T,forward_list在引用所得专业化的任何成员之前完成." [forwardlist.overview/4
  • " 如果分配器满足分配器完整性要求17.6.3.5.1.T实例化list时,可以使用不完整类型T,list在引用所得专业化的任何成员之前完成." [list.overview]/3
  • " 如果分配器满足分配器完整性要求17.6.3.5.1.T实例化vector时,可以使用不完整类型T,vector在引用所得专业化的任何成员之前完成 ." [vector.overview]/3

没有这样的措辞deque,目前需要一个完整的类型.似乎与我不一致允许不完整的类型vector但不是deque,但这就是它的方式.