链接到我的另一个问题(Can I make an assignment operator on a base class that returns sub-class type),我的想法是,我想从GPtrBase派生专用类型,而不必每次都重新编写赋值运算符:

template<class BaseType,class Self>
class GPtrBase
{
public:
    ...

    Self& operator=(const BaseType& rhs)
    {
        ...
        return *this;
    }

};

但是,当我专长像:
class GDrawablePtr : public GPtrBase<MyDrawable,GDrawablePtr>
我收到错误消息:



我以为模板类是根据使用的专业生成的,所以*this首先不应该是GDrawablePtr类型吗?

更新:我注意到,即使using GPtrBase::operator=;绝对未定义任何运算符,如果我添加GDrawablePtr也可以使用。

最佳答案

与动态多态性相反,动态多态性将this函数中的virtual指针自动从基数转换为派生类,您需要对派生类使用显式的static_cast

template<class BaseType,class Self>
class GPtrBase
{
public:
    ...

    Self& operator=(const BaseType& rhs)
    {
        ...
        return static_cast<Self&>(*this);
    }

};

关于c++ - 递归模板模式;类型何时定型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16212828/

10-11 19:10