template <typename T>
class Blob {
public:
typedef typename std::vector<T>::size_type size_type;
// ↑ 為什麼需要這個 typename?
};
在模板定義中,依賴於模板參數的限定型別名稱(如 std::vector<T>::size_type),編譯器無法在實例化前確定它是「型別」還是「靜態成員變數/列舉值」。C++ 標準規定:預設視為非型別,必須加上 typename 告知編譯器「這是一個型別」。
| 程式碼 | 是否需要 typename | 說明 |
|---|---|---|
| 否 | 非依賴型別,編譯期已知 | |
| 是 | 依賴 T,需 typename | |
| 是 | 依賴模板參數 Container | |
| 是 | C++11 別名模板同樣規則 |
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 起部分情況可省略,但加上永不錯)。