我可以实例化一个包含 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
的不完整类型对我来说似乎不一致,但事实就是如此。
我想知道下面的代码大体上是否正确:
#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
的不完整类型对我来说似乎不一致,但事实就是如此。