0

我正在寫一個智能指針作爲我的作業,而且我遇到了一個問題。需要我的智能指針和原始指針之間的轉換,所以操作符重載到我的智能指針類是這樣實現的:如何使此運算符調用明確?

operator T*() { 
    return raw_pointer; 
} 

另一個要求是實現==操作符,它應該聰明之間工作指針之間以及智能指針和原始指針之間。 我已經實現了它這樣的,這超載,也可以在我的智能指針類發現:

bool operator== (const smart_pointer<T> &smart_pointer) { 
    return raw_pointer == smart_pointer.raw_pointer; 
} 

現在,當我嘗試做這樣的事情:

smart_pointer<obj> sp = new obj(); 
obj *p = new obj(); 
if(sp == p) { 
    // do something 
else { 
    // do something else 
} 

我得到以下錯誤信息:

ambiguous overload for 'operator==' 
candidates are: 
operator==(obj*, obj*) <built-in> 
bool smart_pointer<T>::operator==(const smart_pointer<T>&) [with T = obj] 

我猜它不知道它是否應使用內置的一個,我的智能指針轉換爲原始指針,還是應該用我的方法是超載ŧ他==運算符。事情是我目前想不出什麼來解決這種情況。提前致謝!

回答

2

原始指針和智能指針之間的隱式轉換有點危險,這就是標準智能指針不提供它們的原因。如果你只是沒有他們,那將是最好的。

這就是說,這可能不是你的選擇。對於實際問題的解決方案是簡單地添加更多的等於運算符的重載,以便在智能指針和原始指針之間進行混合比較。那些比那些需要在任一方向上進行轉換的人都更受青睞。

1

設置您的構造函數或轉換explicit要解決的模糊性:

explicit smart_pointer(T*); 

explicit operator T*() const { 
    return raw_pointer; 
} 

創建多個重載是其他可替代/補充。

正如在註釋中指出的那樣,您不希望構造函數對指針的過早銷燬是隱式的。

這將是更好的轉換也是明確的,然後加入重載不同combinaison

+1

如果這個智能指針是關於所有權的(因爲大多數智能指針都是),那麼你不希望與原始指針進行比較來銷燬指向該對象的原始指針,對嗎?我想用這個提示你可以弄清楚兩個建議中哪一個是相當不合適的。 ;-) –

+0

@ Cheersandhth.-Alf:好點。 – Jarod42

1

創建比較操作等重載參數類型的每一個可能的組合是不實際的。

使轉換爲原始指針explicit本身可以是一件好事,但不能解決這個問題。歧義將被解決,以便編譯代碼,但代價是爲原始指針創建臨時智能指針。在完整表達式的末尾,智能指針的析構函數會破壞可憐的原始指針的指示對象。

所以一般的解決方案是使每個單參數的構造函數explicit或者添加(非默認)形式參數。