模板继承类派生基赋值
template inherited class derived-base assignment
我有两个类,A和B, B是从A派生的,我不允许更改它们。我正在实现智能指针类。
template <typename T>
class SmartPtr{
...
SmartPtr& operator=(const SmartPtr& p);
...
}
template<typename T>
SmartPtr<T>& SmartPtr<T>::operator=(const SmartPtr & p) {
++*p.cnt;
if(--*cnt == 0) {
delete ptr;
delete cnt;
}
ptr = p.ptr;
cnt = p.cnt;
return *this;
}
当我尝试将SmartPtr A分配给SmartPtr B作为操作数类型不同时,我得到错误。如何在不改变A和B的情况下解决这个问题?
你的答案
我想你可能指的是SmartPtr<A>
和SmartPtr<B>
。当然你不能分配它们,因为A类不是B类。您需要添加另一个赋值操作符,如下所示
tempalte <typename U>
SmartPtr<T>& operator=(const SmartPtr<U>& p);
如果你愿意,你可以用std::enable_if
来确定,U是从T
template <typename U>
SmartPtr<T>& operator=(const typename SmartPtr<std::enable_if<std::is_base_of<T, U>::value, U>::type &p);
,然后你可以实现这一点,通过使用dynamic_cast
在你的代码转换为B
正确答案
使用std::shared_ptr可以使用这个http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast
相关文章:
- 基类和派生类的多态赋值运算符
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 派生自 std::exception 的类的赋值运算符
- 将派生类对象赋值和访问到基类 "pointer to pointer" C++ 中的对象
- 赋值运算符在派生类中不可用
- 在基中使用派生类的赋值运算符
- 如何在C++派生对象的集合中进行搜索和赋值
- 如何防止从字符串派生的 2 个类之间的交叉赋值
- 为什么派生类不使用基类运算符=(赋值运算符)?
- 在将抽象基类作为参数的函数中将指针和赋值运算符与派生类一起使用
- 是否为派生类生成的移动构造函数/赋值运算符
- 复制派生类中的构造和赋值运算符
- c++在派生类中定义复制赋值
- 赋值给派生类的基组件
- 为C++中具有多个继承派生类的vtables的基之一调用赋值运算符
- 派生类继承基类赋值运算符
- C++ - 从基类"inherit"重载赋值运算符派生类的安全/标准方法
- 派生类是否间接继承基的赋值运算符?
- C++:在派生类构造函数中调用基类赋值运算符的形式不正确
- 检测基类对指向派生类的引用的赋值