我想了解以下代码是否正确,或者不是:
#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>仍然是一个不完整的类型.目前有三个容器的不完整类型的内置异常:
T实例化forward_list时,可以使用不完整类型T,forward_list在引用所得专业化的任何成员之前完成." [forwardlist.overview/4T实例化list时,可以使用不完整类型T,list在引用所得专业化的任何成员之前完成." [list.overview]/3T实例化vector时,可以使用不完整类型T,vector在引用所得专业化的任何成员之前完成
." [vector.overview]/3没有这样的措辞deque,目前需要一个完整的类型.似乎与我不一致允许不完整的类型vector但不是deque,但这就是它的方式.