在類模板中定義迭代器成員:
templateclass MyClass { vector ::iterator iter; // 編譯錯誤:need 'typename' before 'vector ::iterator' };
錯誤原因:vector 是依賴類型(依賴於模板參數 T),編譯器在實例化前無法確定它是類型還是靜態成員。
加上 typename 告訴編譯器「這是一個類型」:
templateclass MyClass { typename vector ::iterator iter; // 正確 };
typename。using 別名聲明中,可省略 typename(但傳統位置仍需)。templatestruct Container { using value_type = T; // 依賴類型需 typename typename vector ::iterator begin() { return data.begin(); } typename vector ::const_iterator begin() const { return data.begin(); } vector data; }; // 非依賴類型無需 typename using IntIter = vector ::iterator; // 正確
typename 是模板元編程中區分「類型」與「值」的關鍵字,遇到依賴類型編譯錯誤時加上即可。養成習慣:凡是模板內出現 `依賴名::類型名`,就加 `typename`。