2015-06-03 183 views
0

我有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?

+2

有智能指针实现plnety。你为什么要实现一个? –

+0

您可以发表[MCVE](http://stackoverflow.com/help/mcve) – Alejandro

+0

['std :: shared_ptr']的接口(http://en.cppreference.com/w/cpp/memory/shared_ptr)在实现智能指针时是一个很好的指导。 –

回答

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