我无法将从(模板类的一部分)派生的类DerivedObject(DerivedClass从模板类BaseClass派生的类的BaseObject一部分BaseClass)作为模板类的模板参数传递BaseClass.
这样,Base和Derived类都可以访问对象池,该对象池可以包含派生对象.这听起来有点令人困惑,所以这是一个例子:
template <class TDerivedClass, class TDerivedObject>
class BaseClass
{
protected:
class BaseObject
{
// Class implementation
}
void foo()
{
static_cast<TDerivedClass*>(this)->foo();
}
std::vector<TDerivedObject*> m_objectPool;
};
Run Code Online (Sandbox Code Playgroud)
以上是基类实现.
error C2065: 'DerivedObject' undeclared identifier
Run Code Online (Sandbox Code Playgroud)
上面的错误是由类定义的第一行引起的:
class DerivedClass : public BaseClass<DerivedClass, DerivedClass::DerivedObject>
{
protected:
class DerivedObject : public BaseObject
{
// Class implementation
}
void foo()
{
// Method implementation
}
};
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?如果没有,是否有更好的解决方案可以提供相同/类似的功能?
在此刻
class DerivedClass : public BaseClass<DerivedClass, DerivedClass::DerivedObject>
Run Code Online (Sandbox Code Playgroud)
编译器没有看到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
}
};
Run Code Online (Sandbox Code Playgroud)
这是执行与请求类似的操作的一种方法:
#include <vector>
using std::vector;
template <class TDerivedClass, class TDerivedObject>
class BaseClass
{
public:
class BaseObject
{
// Class implementation
};
protected:
// void foo()
// {
// static_cast<TDerivedClass*>(this)->foo();
// }
// std::vector<TDerivedObject*> m_objectPool;
};
class DerivedClass;
class DerivedObject : public BaseClass<DerivedClass, DerivedObject>::BaseObject
{
// Class implementation
};
class DerivedClass : public BaseClass<DerivedClass, DerivedObject>
{
public:
void foo()
{
// Method implementation
}
};
Run Code Online (Sandbox Code Playgroud)