模板继承类派生基赋值

template inherited class derived-base assignment

本文关键字:赋值 派生 继承      更新时间:2023-10-16

我有两个类,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