我有一個指針類的子集,它看起來像:C++模板和模糊問題
template <typename T>
struct Pointer
{
Pointer();
Pointer(T *const x);
Pointer(const Pointer &x);
template <typename t>
Pointer(const Pointer<t> &x);
operator T *() const;
};
最後一個構造函數的目標是允許通過一個子類的Pointer
,或者基本上任何類型的是可以隱式轉換爲T *
。這個實際規則只能通過構造函數的定義來實施,編譯器實際上無法通過聲明單獨解決。如果我放棄它,並嘗試將Pointer<Sub>
傳遞給構造函數Pointer<Base>
,則會出現編譯錯誤,儘管通過operator T *()
可能會有路徑。
雖然它解決了上述問題,但它創建了另一個。如果我有一個重載函數,其中一個超載需要一個Pointer<UnrelatedClass>
,另一個需要Pointer<BaseClass>
,並且我嘗試用Pointer<SubClass>
來調用它,但是我在兩個重載之間產生了一個模糊性,目的是,後者的重載將被稱爲。
有什麼建議嗎? (希望我是足夠清晰的)
這是更爲常見的使用大寫字母'U'額外的模板參數。小寫't'幾乎看起來像一個錯字。 – GManNickG 2009-12-13 21:43:57
隱式轉換是一個壞主意。使用'T * get()'而不是'運算符T *()'。 shared_ptr做這樣的事情。 – 2009-12-13 21:49:38