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

May I instantiate a templated object A<B> containing a deque of objects of type A<B>?

我想知道下面的代码大体上是否正确:

#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);
}

此代码是使用多个工具链编译的,从未产生过错误(参见 here 示例)。 问题是现在我得到一个实例化错误(可能与我使用的是 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;

如果这段代码是正确的,我没有兴趣调查错误的来源(编译器或标准库实现)或有一个解决方法:同样,我主要想了解上面的代码是否正式正确。

这不是您的编译器或标准库中的错误。程序格式错误。您不能使用不完整的值类型实例化 std::deque

代码格式错误。此时:

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

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

  • "如果分配器满足分配器,实例化forward_list时可能会使用不完整的类型T 完整性要求 17.6.3.5.1。 T 应在结果专业化的任何成员之前完成 引用了 forward_list 个。”[forwardlist.overview]/4
  • "如果分配器满足分配器完整性,实例化list时可能会使用不完整的类型T 要求 17.6.3.5.1。 T 应在 list 的结果特化的任何成员之前完成 引用。” [list.overview]/3
  • "如果分配器满足分配器完整性,实例化vector时可能会使用不完整的类型T 要求 17.6.3.5.1。 T 应在由此产生的专业化的任何成员之前完成 vector 被引用。" [vector.overview]/3

deque没有这样的写法,目前需要完整类型。允许 vector 而不是 deque 的不完整类型对我来说似乎不一致,但事实就是如此。