递归模板模式;何时完成类型?

时间:2013-04-25 10:52:24

标签: c++ templates

链接到我的另一个问题(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确实定义任何运算符,它仍可正常工作。

2 个答案:

答案 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?

似乎你把更多的东西放到模板实例化中,而不是实际存在。类模板就是:一个模板,当给出它的参数时会生成一个类。它不会以任何其他方式将模板参数绑定到结果类。

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