链接到我的另一个问题(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>
我收到错误:
'return':无法转换为'GPtrBase&lt; Base,Self&gt;'到'GDrawablePtr&amp;'
我认为模板类是根据使用的特化生成的,所以首先不应该*this
属于GDrawablePtr
类型?
已更新:我注意到,如果我添加using GPtrBase::operator=;
,那么即使GDrawablePtr
确实不定义任何运算符,它仍可正常工作。
答案 0 :(得分:2)
与动态多态性相反,其中this
- virtual
函数中的指针自动从基础向下转换为派生,您需要对派生类使用显式static_cast
template<class BaseType,class Self>
class GPtrBase
{
public:
...
Self& operator=(const BaseType& rhs)
{
...
return static_cast<Self&>(*this);
}
};
答案 1 :(得分:0)
我认为模板类是基于所使用的特化生成的,所以首先不应该是*类型GDrawablePtr?
似乎你把更多的东西放到模板实例化中,而不是实际存在。类模板就是:一个模板,当给出它的参数时会生成一个类。它不会以任何其他方式将模板参数绑定到结果类。
特别是,在实例化时从实例化类继承的事实不会改变类定义中的任何内容。它仍然是独立的类,它有自己的(尽管有点复杂)类型,因此它与没有模板机制定义的任何其他基类没有什么不同。例如,无论基类或子类是如何创建的,都没有从指针到基类到指向其任何子类的指针的隐式转换。