簡體   English   中英

為什么模板typedef是C ++(而不是C ++ 11)中的一個問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM