gpt4 book ai didi

C++:模板类指针转换

转载 作者:行者123 更新时间:2023-11-30 05:34:34 29 4
gpt4 key购买 nike

我在创建的模板化类中遇到了一个错误,该类包含指向它稍后创建的子项的指针。生成的错误有点奇怪,因为我从未见过。

代码:

template <size_t maxObjects, size_t maxDepth, bool canDelete = false, size_t depth = 0>
struct DynamicQT
{
public:
DynamicQT(const Aabb2& aabb) : aabb(aabb)
{

}
~DynamicQT()
{
clearObjects();
destroyBranches();
}
void insert(Object* object)
{
if (hasBranches())
{
if (object->getAABB().overlaps(tl->aabb)) tl->insert(object);
if (object->getAABB().overlaps(tr->aabb)) tr->insert(object);
if (object->getAABB().overlaps(bl->aabb)) bl->insert(object);
if (object->getAABB().overlaps(br->aabb)) br->insert(object);
}
else objects[(size_t)object] = object;
}
void remove(Object* object)
{
if (hasBranches())
{
if (object->getAABB().overlaps(tl->aabb)) tl->remove(object);
if (object->getAABB().overlaps(tr->aabb)) tr->remove(object);
if (object->getAABB().overlaps(bl->aabb)) bl->remove(object);
if (object->getAABB().overlaps(br->aabb)) br->remove(object);
}
else
{
auto result = objects.find((size_t)object);
if (result != objects.end())
objects.erase((size_t)object);
}
}
void query(const Aabb2& queryRect, std::vector<Object*>& outVec)
{
std::map<size_t, Object*> outMap;
query(queryRect, outMap);
if (depth == 0)
{
for (const auto& item : objects)
outVec.push_back(item.second);
}
}
void update()
{
throw;
}
public:
void query(const Aabb2& queryRect, std::map<size_t, Object*>& outMap)
{
if (hasBranches())
{
if (queryRect.overlaps(tl->aabb)) tl->query(queryRect, outMap);
if (queryRect.overlaps(tr->aabb)) tr->query(queryRect, outMap);
if (queryRect.overlaps(bl->aabb)) bl->query(queryRect, outMap);
if (queryRect.overlaps(br->aabb)) br->query(queryRect, outMap);
}
else outMap.insert(objects.begin(), objects.end());
}
void clearObjects()
{
if (canDelete)
{
for (const auto& obj : objects)
if (obj.second) delete obj.second;
}
objects.clear();
}
void createBranches()
{
if (!hasBranches() && depth < maxDepth)
{
Vector2 half = aabb.halfWidths();
Aabb2 a(aabb.pos, half);
Aabb2 b(aabb.pos.addX(half.x), half);
Aabb2 c(aabb.pos.addY(half.y), half);
Aabb2 d(aabb.center(), half);
tl = new DynamicQT<maxObjects, maxDepth, canDelete, depth + 1>(a);
tr = new DynamicQT<maxObjects, maxDepth, canDelete, depth + 1>(b);
bl = new DynamicQT<maxObjects, maxDepth, canDelete, depth + 1>(c);
br = new DynamicQT<maxObjects, maxDepth, canDelete, depth + 1>(d);
}
}
void passObjectsToBranches()
{
if (hasBranches())
{
Object* obj = nullptr;
for (const auto& item : objects)
{
obj = item.second;
if (obj->getAABB().overlaps(tl->aabb)) tl->insert(obj);
if (obj->getAABB().overlaps(tr->aabb)) tr->insert(obj);
if (obj->getAABB().overlaps(bl->aabb)) bl->insert(obj);
if (obj->getAABB().overlaps(br->aabb)) br->insert(obj);
}
clearObjects();
}
}
void getObjectsFromBranches()
{
if (hasBranches())
{
objects.insert(tl->objects.begin(), tl->objects.end());
objects.insert(tr->objects.begin(), tr->objects.end());
objects.insert(bl->objects.begin(), bl->objects.end());
objects.insert(br->objects.begin(), br->objects.end());
}
}
void destroyBranches()
{
if (hasBranches())
{
delete tl;
delete tr;
delete bl;
delete br;
}
}
bool hasBranches() const
{
return (tl && tr && bl && br);
}
public:
private:
Aabb2 aabb;
DynamicQT* tl = nullptr;
DynamicQT* tr = nullptr;
DynamicQT* bl = nullptr;
DynamicQT* br = nullptr;
std::map<size_t, Object*> objects;
};

注意:更新尚未实现

准确的错误是:

error C2440: '=' : cannot convert from 'DynamicQT<10,10,true,1> *' to 'DynamicQT<10,10,true,0> *'

当我搜索修复时,我不得不删除“深度 + 1”或只删除“+ 1”并编译正常,但显然不应该发生。

感谢任何帮助(代码可能还有任何问题)。

最佳答案

DynamicQT的模板参数是实例化类型的一部分。因此,DynamicQT<10,10,true,0>DynamicQT<10,10,true,1>是不相关的类型,它们的指针不能相互隐式转换。似乎如果 depth是 0 那么 child 应该有深度 1 等等,所以你应该声明 child 指针有适当的类型:

private:
Aabb2 aabb;
typedef DynamicQT<maxObjects, maxDepth, canDelete, depth+1> ChildDynamicQT;
ChildDynamicQT* tl = nullptr;
ChildDynamicQT* tr = nullptr;
ChildDynamicQT* bl = nullptr;
ChildDynamicQT* br = nullptr;

关于C++:模板类指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34169001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com