C++ 中的 Typename 關鍵字
Suraj P
2023年10月12日
C++
C++ typename
本文將討論 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。
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
