C++ 中的 Typename 關鍵字
Suraj P
2023年10月12日
本文將討論 C++ 中的關鍵字 typename
。
要理解關鍵字 typename
的意義,我們需要了解 qualified
和 dependent
名稱的關鍵概念。
C++ 中的限定名和非限定名
限定名稱指定範圍。讓我們看一個例子來更好地理解它。
#include <bits/stdc++.h>
int main() { std::cout << "Hello world!" << std::endl; }
對 cout
和 endl
的引用在這裡是限定名稱。但是,如果我們使用 using
宣告將它們都帶入範圍,即 using namespace std
並且僅使用 cout
本身,它們將成為 unqualified
名稱,因為它們缺少 std::
。
C++ 中的從屬和非從屬名稱
從屬名稱是依賴於模板
引數的名稱。
讓我們看一個示例程式碼以更好地理解它。
template <class T>
class MyClass {
int i;
vector<int> vi;
vector<int>::iterator vitr;
T t;
vector<T> vt;
vector<T>::iterator viter;
}
前三個宣告被稱為非依賴名稱,因為它們的型別在模板宣告時是已知的。
而如果我們檢視第二組宣告,T
、vector<T>
和 vector<T>::iterator
是依賴名稱,因為它們的型別直到例項化點才知道,因為它們依賴於模板引數 T
。
在 C++ 中使用 typename
關鍵字
作為一般規則,在引用型別的限定名稱或從屬名稱之前必須使用 typename
關鍵字。
因此,引入關鍵字 typename
來指定後面的識別符號是型別而不是靜態成員變數。
class A {
public:
typedef int myPtr;
};
template <class T>
class myClass {
public:
typename T::SubType* myPtr;
}
在上面的程式碼中,typename
關鍵字告訴編譯器 SubType
是類 T
的型別,這意味著指標 myptr
是 T::SubType
的型別。
如果沒有 typename
關鍵字,SubType
將被視為靜態成員,編譯器會將其評估為 T
型別的 SubType
與指標 myptr
的乘積。
T::SubType * myptr //compiler will think it's multiplication
如果我們在上面的程式碼中不使用關鍵字 typename
,會導致編譯時錯誤,因為編譯器不知道 T::SubType
是引用型別名還是引用的靜態成員 T
。