2013-04-25 117 views
1

链接到我的其他问题(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>

我得到的错误:

“回归”:不能从转换“GPtrBase <基地,自>”到“GDrawablePtr &”

我想基于使用的专业化生成一个模板类,所以不宜*this是在首位输入GDrawablePtr

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

+0

您发布的代码原样:http://ideone.com/4grkfv – SomeWittyUsername 2013-04-25 11:46:12

+0

@icepack非常奇怪。 Eiter这是我的编译器(VC++ 2005)的一个怪癖,或者完整代码的一些细节应该归咎于它。我会用较简单的版本进行调查来检查。 – 2013-04-25 12:03:02

+0

@icepack不,它不。由于其参数的类型,“operator =”会被忽略。请参阅http://ideone.com/EWrVAh的程序输出。由于不需要,编译器不会尝试编译它,因此缺少错误消息。 – NonNumeric 2013-04-25 17:34:39

回答

2

相较于动态多态性在终场thisvirtual功能为基础自动垂头丧气派生,你需要使用一个明确的static_cast派生类

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

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

}; 
0

我想到了一个模板类是基于所使用的特化生成的,所以不应该*这是GDrawablePtr类型的第一位?

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

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