Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:模板化类指针转换_C++ - Fatal编程技术网

C++ C++;:模板化类指针转换

C++ C++;:模板化类指针转换,c++,C++,我在创建的模板类中遇到了一个错误,该类包含指向它后来创建的子类的指针。生成的错误有点奇怪,因为我从未见过它 代码: 模板 结构动态 { 公众: 动态(常数Aabb2和aabb):aabb(aabb) { } ~DynamicQT() { clearObjects(); 破坏分支(); } 空插入(对象*对象) { if(hasBranchs()) { 如果(object->getAABB().overlaps(tl->aabb))tl->insert(object); 如果(object->ge

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

代码:

模板
结构动态
{
公众:
动态(常数Aabb2和aabb):aabb(aabb)
{
}
~DynamicQT()
{
clearObjects();
破坏分支();
}
空插入(对象*对象)
{
if(hasBranchs())
{
如果(object->getAABB().overlaps(tl->aabb))tl->insert(object);
如果(object->getAABB().overlaps(tr->aabb))tr->insert(object);
如果(object->getAABB().重叠(bl->aabb))bl->insert(object);
如果(object->getAABB().重叠(br->aabb))br->insert(object);
}
其他对象[(大小)对象]=对象;
}
无效删除(对象*对象)
{
if(hasBranchs())
{
如果(object->getAABB().overlaps(tl->aabb))tl->remove(object);
如果(object->getAABB().overlaps(tr->aabb))tr->remove(object);
如果(object->getAABB().重叠(bl->aabb))bl->remove(object);
如果(object->getAABB().重叠(br->aabb))br->remove(object);
}
其他的
{
自动结果=对象。查找((大小)对象);
if(result!=objects.end())
对象。擦除((大小)对象);
}
}
无效查询(常量Aabb2和queryRect,std::vector和outVec)
{
std::map outMap;
查询(queryRect、outMap);
如果(深度==0)
{
用于(常量自动和项目:对象)
outVec.推回(第二项);
}
}
无效更新()
{
投掷;
}
公众:
无效查询(常量Aabb2和queryRect,std::map和outMap)
{
if(hasBranchs())
{
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()
{
如果(烛台)
{
用于(常量自动和对象:对象)
如果(目标秒)删除目标秒;
}
对象。清除();
}
void createbranchs()
{
如果(!hasBranchs()&&depthgetAABB().重叠(tl->aabb))tl->insert(obj);
如果(obj->getAABB().重叠(tr->aabb))tr->insert(obj);
如果(obj->getAABB().重叠(bl->aabb))bl->insert(obj);
如果(obj->getAABB().重叠(br->aabb))br->insert(obj);
}
clearObjects();
}
}
void getObjectsFromBranchs()
{
if(hasBranchs())
{
insert(tl->objects.begin(),tl->objects.end());
insert(tr->objects.begin(),tr->objects.end());
insert(bl->objects.begin(),bl->objects.end());
插入(br->objects.begin(),br->objects.end());
}
}
作废
{
if(hasBranchs())
{
删除tl;
删除tr;
删除bl;
删除br;
}
}
布尔常数
{
返回(tl&&tr&&bl&&br);
}
公众:
私人:
Aabb2-aabb;
DynamicQT*tl=nullptr;
DynamicQT*tr=nullptr;
DynamicQT*bl=nullptr;
DynamicQT*br=nullptr;
地图对象;
};
注:更新尚未实施

确切的错误是:

错误C2440:“=”:无法从“DynamicQT*”转换为 “DynamicQT*”

当我搜索修复程序时,我不得不删除“depth+1”或只删除“+1”并编译良好,但显然这是不应该发生的


非常感谢您的帮助(可能还有代码中的任何问题)。

DynamicQT的模板参数是实例化类型的一部分。因此,
DynamicQT
DynamicQT
是不相关的类型,它们的指针不能相互隐式转换。似乎如果
depth
为0,那么子指针应该具有depth 1,依此类推,因此您应该声明子指针具有适当的类型:

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

感谢您闪电般的响应,它的工作完美无瑕,少了一些错误。
private:
Aabb2 aabb;
typedef DynamicQT<maxObjects, maxDepth, canDelete, depth+1> ChildDynamicQT;
ChildDynamicQT* tl = nullptr;
ChildDynamicQT* tr = nullptr;
ChildDynamicQT* bl = nullptr;
ChildDynamicQT* br = nullptr;