1

链接到我的另一个问题(我可以在返回子类类型的基类上创建一个赋值运算符)我有这个构造,我的想法是我想从中派生专门的类型,GPtrBase而不必每次都重新编写一个赋值运算符:

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

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

};

但是,当我专门喜欢:

class GDrawablePtr : public GPtrBase<MyDrawable,GDrawablePtr>

我收到错误:

'return' : 无法从 'GPtrBase<Base,Self>' 转换为 'GDrawablePtr &'

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

更新:我注意到如果我添加using GPtrBase::operator=;它然后工作,即使GDrawablePtr绝对没有定义任何运算符。

4

2 回答 2

2

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

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

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

};
于 2013-04-25T11:43:43.137 回答
0

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

看起来你在模板实例化中投入的比实际更多。类模板就是这样:一个模板,当给定它的参数时会生成一个类。它不会以任何其他方式将模板参数绑定到结果类。

特别是,您在实例化点从实例化类继承这一事实不会改变类定义中的任何内容。它仍然是具有自己(尽管有些复杂)类型的独立类,因此它与没有模板机制定义的任何其他基类没有什么不同。例如,无论基类或子类是如何创建的,都没有从指向基类的指针到指向其任何子类的指针的隐式转换。

于 2013-04-25T17:51:19.593 回答