C++ 中的 Typename 關鍵字

Suraj P 2023年10月12日
  1. C++ 中的限定名和非限定名
  2. C++ 中的從屬和非從屬名稱
  3. 在 C++ 中使用 typename 關鍵字
C++ 中的 Typename 關鍵字

本文將討論 C++ 中的關鍵字 typename

要理解關鍵字 typename 的意義,我們需要了解 qualifieddependent 名稱的關鍵概念。

C++ 中的限定名和非限定名

限定名稱指定範圍。讓我們看一個例子來更好地理解它。

#include <bits/stdc++.h>

int main() { std::cout << "Hello world!" << std::endl; }

coutendl 的引用在這裡是限定名稱。但是,如果我們使用 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;
}

前三個宣告被稱為非依賴名稱,因為它們的型別在模板宣告時是已知的。

而如果我們檢視第二組宣告,Tvector<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 的型別,這意味著指標 myptrT::SubType 的型別。

如果沒有 typename 關鍵字,SubType 將被視為靜態成員,編譯器會將其評估為 T 型別的 SubType 與指標 myptr 的乘積。

T::SubType * myptr //compiler will think it's multiplication

如果我們在上面的程式碼中不使用關鍵字 typename,會導致編譯時錯誤,因為編譯器不知道 T::SubType 是引用型別名還是引用的靜態成員 T

作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub