链接到我的另一个问题(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/