模板是 C++ 實現**泛型編程**的核心機制,支援**類型參數化**,實現真正的代碼複用。分為函數模板與類模板兩大類。本文系統梳理語法規範、定義格式、常見錯誤與非類型參數用法。
template // 或 typename T
ReturnType FunctionName(ParamList) {
// 函數體,使用 T 作為類型
}
template 關鍵字不可省略class/typename 等價,每個類型參數前必須加template template
T max(T &x, T &y) { // 參數用引用避免拷貝
return (x > y) ? x : y;
}
int main() {
int i1=3, i2=5;
char c1='a', c2='b';
double d1=0.35, d2=0.2;
cout << max(i1,i2) << max(c1,c2) << max(d1,d2);
}
// template.h
template
class MyClass {
private:
T1 m_i; T2 m_j;
public:
MyClass(T1 a, T2 b); // 構造函數聲明
void Show(); // 成員函數聲明
};
// 類外定義:每個成員函數前必須加模板聲明,類名帶參數
template
MyClass::MyClass(T1 a, T2 b) : m_i(a), m_j(b) {}
template
void MyClass::Show() {
cout << "I=" << m_i << ", J=" << m_j << endl;
}
MyClass obj1(1, 2);
MyClass obj2('a', 'b');
obj1.Show(); obj2.Show();
template <...> class Name { ... };template <...> RetType Name::Func(...) Name var(args); 模板參數除類型外,還可為:
template 不可用:浮點數、內部鏈接物件指標、字串字面值。
template
class Stack {
T _elems[MAXSIZE];
int _top;
public:
Stack() : _top(0) {}
void Push(const T& v) { _elems[_top++] = v; }
T Pop() { return _elems[--_top]; }
};
int main() {
Stack s1;
Stack s2;
// s1 與 s2 是完全不同的類型
}
| 錯誤 | 正確 | 原因 |
|---|---|---|
| 模板聲明與函數間插入語句 | 緊貼 | 語法規定 |
類模板成員函數定義漏掉 template<...> | 每個成員函數定義前加 | 編譯器需知曉模板參數 |
實例化寫成 MyClass 而非 MyClass | 加變數名 | 實例化需產生對象 |
| 函數模板參數未用引用 | 用 T& 或 const T& | 避免不必要拷貝,支援臨時對象 |