Я пытаюсь реализовать квадродерево и хочу поместить его в библиотеку, чтобы мне не приходилось копировать и реорганизовывать код каждый раз, когда он мне нужен. Я придумал интерфейсы hasPos
и hasDim
, чтобы у меня были прямоугольные объекты для работы:
class hasPos {
protected:
vec2 pos;
};
class hasDim: public hasPos {
protected:
vec2 dim;
// ...
};
template<int capacity, typename t, typename = std::enable_if<std::is_base_of<hasDim, t>::value && std::is_pointer<t>::value>>
class quadtree {
quadtree<capacity, t> nw, ne, sw, se; // for subdivision when capacity is exceeded
// ...
};
Когда я компилирую библиотеку, она работает просто отлично, но когда я компилирую проект с quadtree
в нем, компилятор жалуется на неполный тип:
error: 'quadtree<capacity, t, <template-parameter-1-3> >::ne' has incomplete type
Это действительно выглядит так, как будто std::enable_if
является проблемой.
РЕДАКТИРОВАТЬ:
Как предлагается в комментариях, я превратил nw, ne, sw, se
в *nw, *ne, *sw, *se
. Казалось, что это работает, но через несколько часов он снова жалуется на неполный тип после того, как я переместил реализацию в модуль компиляции:
bin.cpp:32:40: error: invalid use of incomplete type 'struct quadtree<capacity, t>'
32 | void quadtree<capacity, t>::addObj(t o) {
|