模板继承了类派生基赋值

时间:2015-06-03 20:36:36

标签: c++ templates

我有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的情况下修复它?

1 个答案:

答案 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

来实现此目的

&#39;正确&#39;答案

使用std :: shared_ptr你可以使用它 http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast