首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ Primer 模板 typename 關鍵字用法解析:依賴型別名稱與編譯器歧義消除

     編輯:程式設計綜合問答

程式碼片段

template <typename T>
class Blob {
public:
    typedef typename std::vector<T>::size_type size_type;
    //               ↑ 為什麼需要這個 typename?
};

核心規則

在模板定義中,依賴於模板參數的限定型別名稱(如 std::vector<T>::size_type),編譯器無法在實例化前確定它是「型別」還是「靜態成員變數/列舉值」。C++ 標準規定:預設視為非型別,必須加上 typename 告知編譯器「這是一個型別」。

對比示例

typedef std::vector<int>::size_type A;typedef typename std::vector<T>::size_type B;typename Container::iterator it;using ValueType = typename Traits::Value;
程式碼是否需要 typename說明
否非依賴型別,編譯期已知
是依賴 T,需 typename
是依賴模板參數 Container
是C++11 別名模板同樣規則

C++20 概念寫法(更直觀)

template <std::ranges::range R>
using size_type = std::ranges::range_size_t<R>; // 無需 typename,概念約束已明確型別

常見錯誤訊息

error: need 'typename' before 'std::vector::size_type' because 'std::vector' is a dependent scope

總結

typename 在此處非修飾符,而是編譯器指示詞,消除「依賴型別名稱」的歧義。養成習慣:只要是「模板參數::巢狀型別」模式,就加 typename(C++17 起部分情況可省略,但加上永不錯)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved