C++ c+的问题+;四叉树

C++ c+的问题+;四叉树,c++,quadtree,incomplete-type,C++,Quadtree,Incomplete Type,我在一个库中实现一个四叉树,编译器不断抛出关于不完整类型的错误: 四叉树 模板 结构四叉树{ bool=false; 四叉树*nw、*ne、*sw、*se; std::矢量对象; rect2b; 四叉树(rect2界):b(b){} void addObj(t); 无效分割(); 无效转让(t); void empty(); }; bin.cpp #包括“quadtree.h” 模板 void四叉树::addObj(to){ 如果(!除以){ 对象推回(o); if(objs.size()>容

我在一个库中实现一个四叉树,编译器不断抛出关于不完整类型的错误: 四叉树

模板
结构四叉树{
bool=false;
四叉树*nw、*ne、*sw、*se;
std::矢量对象;
rect2b;
四叉树(rect2界):b(b){}
void addObj(t);
无效分割();
无效转让(t);
void empty();
};
bin.cpp

#包括“quadtree.h”
模板
void四叉树::addObj(to){
如果(!除以){
对象推回(o);
if(objs.size()>容量){
除法();
}
}否则{
指派(o);
}
}
模板
void四叉树::divide(){
除以=真;
nw=新的四叉树(rect2(b.x(),b.y(),b.w()/2,b.h()/2));
ne=新的四叉树(rect2(b.x()+b.w()/2,b.y(),b.w()/2,b.h()/2));
sw=新的四叉树(rect2(b.x(),b.y()+b.h()/2,b.w()/2,b.h()/2));
se=新的四叉树(rect2(b.x()+b.w(),b.y()+b.h(),b.w()/2,b.h()/2));
用于(自动o:objs){
指派(o);
}
调整对象大小(0);
}
模板
void四叉树::分配(TO){
rect2 orect=o.makeRect();
if(orect.intersects(nw.bounds)){nw.addObj(o);}
如果(或截交(ne边界)){ne.addObj(o);}
如果(或切相交(西南边界)){sw.addObj(o);}
if(orect.intersects(se.bounds)){se.addObj(o);}
}
模板
void四叉树::empty(){
如果(分割){
分开=假;
nw.empty();ne.empty();sw.empty();se.empty();
删除西北、东北、西南、东南;
}否则{
调整对象大小(0);
}
}
根据,一个不完整的类型是一个大小无法确定的类型,但我不知道这可能来自哪里:
bool divided
可以确定;
quadtree*
s是指针,其大小可以确定
std::vector objs
是一个向量,这意味着它存储一个动态分配的数组,这意味着它的大小也可以确定;这同样适用于只存储4个双精度的
rect2b
。知道问题出在哪里吗

编辑:

以下是错误消息:

bin.cpp:32:40: error: invalid use of incomplete type 'struct quadtree<capacity, t>'
   32 |  void quadtree<capacity, t>::addObj(t o) {
      |
bin.cpp:32:40:错误:对不完整类型“struct quadtree”的使用无效
32 | void四叉树::addObj(to){
|
根据微软的说法,不完整类型的大小无法确定

这不是“不完整类型”的意思。这是一个适用于不完整类型的属性

不完整类型是尚未定义的类型。例如:

class X;            // this is not a definition; X is incomplete
auto s = sizeof(X); // program is ill-formed because size of X is not known
class Y;            // this is not a definition; Y is incomplete
Y::Y() {}           // program is ill-formed because Y is incomplete
定义类的成员函数是不完整类型无法完成的另一件事。例如:

class X;            // this is not a definition; X is incomplete
auto s = sizeof(X); // program is ill-formed because size of X is not known
class Y;            // this is not a definition; Y is incomplete
Y::Y() {}           // program is ill-formed because Y is incomplete

回到您的问题:您试图在bin.cpp中定义
quadtree
的成员函数,即使bin.cpp不包含
quadtree
的定义,但必须首先定义
quadtree
。只需包含包含定义的标题。

quadtree.h
中定义结构,但在结构内部,您已经在构造函数的内联定义中使用了它(
quadtree(rect2边界):b(b){}
),这是不允许的,因为它还没有完全定义。编译器无法生成构造函数的代码,因为它还不知道还会有多少数据成员


您可以通过只声明构造函数来避免此问题:
quadtree(rect2边界):b(b);
,然后分别(在结构的
}
之后)添加其定义
template quadtree::quadtree(rect2边界){}

问题在于如何定义属于模板类的成员函数

在类的声明中,您说
quadtree
是一个包含3个参数的模板,但是当您定义成员函数时,您只列出了两个

要修复此问题,只需指定模板采用以下三个参数:

template<int capacity,
         typename t,
         typename z>
void quadtree<capacity, t, z>::divide() {
模板
void四叉树::divide(){
这里不指定第三个参数的默认值,因为在声明模板时已经指定了该参数

或者,您可以在模板类定义中内联定义函数


请记住,模板类定义需要删除,而不是.cpp文件。

Me from(相当多)未来,解决方案是抛弃
std::enable_if
s。我仍然不清楚它们为什么会导致问题,但在类主体中用一个
static_assert
替换它们就足以解决问题。无论如何,孩子们,不要使用此代码。这太可怕了。

@无用的已修复。它包括在内,我没有在问题中显示出来n因为bin.cpp包含整个库的实现,include位于文件的顶部。无论如何,我仔细检查了一下,它确实在那里。无论如何,谢谢:)@leonardovegetti好吧,我只能解决示例中的问题;我猜不出其他程序中有什么问题。标题不包括在已尝试,但除了为构造函数引发错误之外,没有任何更改