Я реализую quadtree в библиотеке, и компилятор продолжает выдавать ошибки, говоря о неполном типе: quadtree.h
template<int capacity,
typename t,
typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
struct quadtree {
bool divided = false;
quadtree<capacity, t>* nw,* ne,* sw,* se;
std::vector<t> objs;
rect2 b;
quadtree(rect2 bounds): b(b) {}
void addObj(t);
void divide();
void assign(t);
void empty();
};
bin. cpp
#include "quadtree.h"
template<int capacity,
typename t,
typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
void quadtree<capacity, t>::addObj(t o) {
if(!divided) {
objs.push_back(o);
if(objs.size() > capacity) {
divide();
}
} else {
assign(o);
}
}
template<int capacity,
typename t,
typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
void quadtree<capacity, t>::divide() {
divided = true;
nw = new quadtree<capacity, t>(rect2(b.x(), b.y(), b.w()/2, b.h()/2));
ne = new quadtree<capacity, t>(rect2(b.x()+b.w()/2, b.y(), b.w()/2, b.h()/2));
sw = new quadtree<capacity, t>(rect2(b.x(), b.y()+b.h()/2, b.w()/2, b.h()/2));
se = new quadtree<capacity, t>(rect2(b.x()+b.w(), b.y()+b.h(), b.w()/2, b.h()/2));
for(auto o: objs) {
assign(o);
}
objs.resize(0);
}
template<int capacity,
typename t,
typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
void quadtree<capacity, t>::assign(t o) {
rect2 orect = o.makeRect();
if(orect.intersects(nw.bounds)) {nw.addObj(o);}
if(orect.intersects(ne.bounds)) {ne.addObj(o);}
if(orect.intersects(sw.bounds)) {sw.addObj(o);}
if(orect.intersects(se.bounds)) {se.addObj(o);}
}
template<int capacity,
typename t,
typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
void quadtree<capacity, t>::empty() {
if(divided) {
divided = false;
nw.empty(); ne.empty(); sw.empty(); se.empty();
delete nw, ne, sw, se;
} else {
objs.resize(0);
}
}
Согласно microsoft , неполный тип - это тот, размер которого не может быть определен, но здесь я понятия не имею, откуда это может быть получено: bool divided
можно определить; quadtree<capacity, t>*
s - это указатели, размер которых можно определить; std::vector<t> objs
- это вектор, что означает, что он хранит динамически распределенный массив, что означает, что его размер также может быть определен; То же самое касается rect2 b
, который хранит только 4 двойных. Любая идея, откуда может возникнуть проблема?
РЕДАКТИРОВАТЬ:
Вот сообщение об ошибке:
bin.cpp:32:40: error: invalid use of incomplete type 'struct quadtree<capacity, t>'
32 | void quadtree<capacity, t>::addObj(t o) {
|