我有2个班,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的情况下修复它?
答案 0 :(得分:1)
我认为您的意思可能是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
将A转换为B
使用std :: shared_ptr你可以使用它 http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast