模板參數列表中的 typename T(或 class T)聲明一個類型參數。C++17 起允許在模板參數中使用 auto 推導非類型參數,但類型參數仍是核心。
template class Buffer ,使用時可省略類型實參。template class Container> class Wrapper,接受類模板作為參數。template void func(Args... args) ,配合參數包展開實現可變參數函數。類型參數可用於:
T value;T func(const T& arg)std::vector vec; class Derived : public BaseT* ptr; T& ref; const T c;模板定義上下文中,類型參數名會遮蔽外部同名聲明。在模板內部使用依賴類型(如 T::type)時,需加 typename 關鍵字告知編譯器這是一個類型:
template void foo() {
typename T::value_type v; // 必須加 typename
}
除類型參數外,模板還接受:
template struct Array typename 而非 class 聲明類型參數,語義更清晰。Key, Value, Allocator)。typename,避免編譯錯誤。