[英]Why is template typedef an issue in C++ (not C++11)
在這個問題中 ,OP要求提供模板typedef的解決方案,這在C ++中是不可能的。 OP也提出了一個解決方案,但不喜歡它:
template<size_t N, size_t M>
class Matrix {
// ....
};
// Problem - will not compile
typedef Matrix<N,1> Vector<N>;
// Solution
template <int N>
class Vector: public Matrix<N,1>
{ };
我的問題是, Helper::type
解決方案在OP的解決方案上給我們帶來了什么好處(假設這些類永遠不會被基指針或new
'd這樣使用)? 一個空類在釋放時應該沒有開銷(或者是嗎?)。 我能看到的唯一缺點是,在調試版本中,您必須在調試時擴展基類。
編輯:除了選定的答案,請參閱@ Dani的答案誰建議繼承版本需要定義構造函數,這是一個額外的不便。
這是因為構造函數不是繼承的(並且在c ++ 11中不是默認的)。 所以你必須復制所有非默認構造,即使你只是在實現中調用基類構造函數。
typedef
的要點是定義一個類型別名。 子類不是類型別名 - 它是一種新類型。
例如,想象一下庫函數
template<size_t N, size_t M>
Matrix<N, M> * createMatrix();
現在有助手類型
Vector<3>::type * var = createMatrix<3, 1>();
是合法的。
繼承
Vector<3> * var = createMatrix<3, 1>();
不是。
除了每個人對語法(可能是主觀的)的品味之外,主要區別在於,通過inhetirance,vector實際上是另一種衰變為矩陣的類型,而使用包含typedef的幫助器,vector是矩陣的別名(至少對於什么部分專業化適用)。
差異需要向量來重新定義構造函數(不是繼承的),或者在模板專業化定義的操作情況下存在一些潛在的陷阱(使用typedef,它們永遠不會被視為“不同的”)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.