Bai*_*ang 5 c++ inheritance templates
我有以下模板代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
但编译失败并显示错误消息(VS2008):
错误C2679:二进制"=":没有操作员发现它采用类型>>"类名*"的右边的操作数(或没有可接受的转化率)
为什么它不起作用,因为我在模板基类中定义了一个运算符?
ava*_*kar 12
它得到了继承.但是,编译器生成的赋值运算符用于TempaltePtr_ClassName隐藏继承的运算符.您可以通过添加使其可见
using TempaltePtr<ClassName>::operator=;
Run Code Online (Sandbox Code Playgroud)
你的派生类.
除非提供显式使用声明,否则operator =始终由派生类实现隐藏.对于类模板和普通类都是如此.
顺便说一句,你的运营商声明=非常非标准.对于"A"级,通常会声明它.
A& operator=(A const &);
Run Code Online (Sandbox Code Playgroud)
这可能是你正在寻找的东西(和编译)
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |