2015-06-03 182 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