我有以下模板代码:
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):
错误C2679:二进制'=':找不到哪个运算符采用类型&gt;&gt;'ClassName *'的右手操作数(或者没有可接受的转换)
为什么它不起作用,因为我在模板基类中定义了一个运算符?
答案 0 :(得分:12)
它被继承了。但是,TempaltePtr_ClassName
的编译器生成的赋值运算符隐藏了继承的运算符。您可以通过添加
using TempaltePtr<ClassName>::operator=;
到派生类。
答案 1 :(得分:8)
operator =始终由派生类实现隐藏,除非提供了明确的using声明。对于类模板和普通类都是如此。
顺便说一句,您对operator =的声明非常不标准。对于'A'类,通常会声明它。A& operator=(A const &);
这可能是你正在寻找的东西(和编译)
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
}