为什么operator =不会从模板类继承 [英] Why operator = doesn't get inherited from a template class
问题描述
我有以下模板代码:
class ClassName{};
template <class T>
class TemplatePtr
{
public:
void operator=(T* p)
{
}
};
class TemplatePtr_ClassName: public TemplateePtr<ClassName>
{
public:
~TempaltePtr_ClassName();
};
void Test()
{
TemplatePtr_ClassName data;
data = new ClassName;
}
但编译失败并显示错误讯息(VS2008):
but compile fails with error message (VS2008):
错误C2679:binary'=':无操作符,它接受类型为>> ClassName *'的右手操作数或没有可接受的转换)
error C2679: binary '=' : no operator found which takes a right-hand operand of type >>'ClassName *' (or there is no acceptable conversion)
为什么它不工作,在模板基类中?
Why it won't work as I have defined an operator in the template base class?
推荐答案
operator =始终被派生类实现隐藏,除非提供了显式使用声明。对于类模板和普通类都是如此。
operator = is always hidden by the derived class implementation unless explicit using declaration is provided. This is true for both class templates and ordinary classes.
BTW,你的statement =的声明是非标准的。它通常被声明为类'A'。
BTW, your declaration of operator= is very nonstandard. It is usually declared so for a class 'A'.
A& operator=(A const &);
这里是可能是你正在寻找(和编译)的东西
Here is something that may be what you are looking for (and compiles)
template <class T>
class TemplatePtr
{
public:
TemplatePtr& operator=(TemplatePtr const &)
{return *this;}
};
template<class T>
class TemplatePtr_ClassName: public TemplatePtr<T>
{
public:
~TemplatePtr_ClassName(){};
TemplatePtr_ClassName& operator=(TemplatePtr_ClassName const &that){
TemplatePtr<T>::operator=(that); // invoke base class assignment operator
return *this;
}
};
int main()
{
TemplatePtr_ClassName<int> data;
data = *new TemplatePtr_ClassName<int>;
// delete stuff
}
这篇关于为什么operator =不会从模板类继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!