gpt4 book ai didi

C++ 将派生类作为基类模板参数传递

转载 作者:可可西里 更新时间:2023-11-01 18:31:27 28 4
gpt4 key购买 nike

我在传递派生自 BaseObject 的类 DerivedObject(派生自模板类 BaseClass 的类 DerivedClass 的一部分)时遇到问题(模板类 BaseClass 的一部分)作为模板类 BaseClass 的模板参数。

这样,基类和派生类都可以访问包含派生对象的对象池。这听起来有点令人困惑,下面是示例:

template <class TDerivedClass, class TDerivedObject>
class BaseClass
{
protected:
class BaseObject
{
// Class implementation
}
void foo()
{
static_cast<TDerivedClass*>(this)->foo();
}
std::vector<TDerivedObject*> m_objectPool;
};

以上是基类实现

error C2065: 'DerivedObject' undeclared identifier

上面的错误是由下面类定义的第一行引起的:

class DerivedClass : public BaseClass<DerivedClass, DerivedClass::DerivedObject>
{
protected:
class DerivedObject : public BaseObject
{
// Class implementation
}
void foo()
{
// Method implementation
}
};

有没有办法做到这一点?如果没有,是否有更好的解决方案可以提供相同/相似的功能?

最佳答案

此时

class DerivedClass : public BaseClass<DerivedClass, DerivedClass::DerivedObject>

编译器没有看到DerivedClass::DerivedObject所以你得到一个未声明的标识符错误。由于尚未看到它们的类型,因此您不能将其用作模板参数。你得不到一个 DerivedClass因为你已经声明了 DerivedClass作为 class .

您可以更改基类并让它存储一个 std::vector<BaseObject*>在其中,如果这样做,则可以将代码更改为:

template <class TDerivedClass>
class BaseClass
{
protected:
class BaseObject
{
// Class implementation
};
void foo()
{
static_cast<TDerivedClass*>(this)->foo();
}
std::vector<BaseObject*> m_objectPool;
};

class DerivedClass : public BaseClass<DerivedClass>
{
protected:
class DerivedObject : public BaseObject
{
// Class implementation
};
void foo()
{
// Method implementation
}
};

关于C++ 将派生类作为基类模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207108/

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