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

Pau*_* A. 7 c++ templates

我无法将从(模板类的一部分)派生的类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)

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

Nat*_*ica 5

在此刻

class DerivedClass : public BaseClass<DerivedClass, DerivedClass::DerivedObject>
Run Code Online (Sandbox Code Playgroud)

编译器没有看到DerivedClass::DerivedObject你得到一个未声明的标识符错误.由于尚未看到它们的类型,因此无法将其用作模板参数.你没有得到一个,DerivedClass因为你已经宣布DerivedClassclass.

您可以更改基类并将其存储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)


Eri*_*pää 2

这是执行与请求类似的操作的一种方法:

#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)