派生類構造函數初始化列表中調用基類構造函數時,**必須帶上模板參數**:
template <class T>
class Derive : public Base<T> {
public:
Derive(T n) : Base<T>(n) { } // 正確:Base<T>(n)
// Derive(T n) : Base(n) { } // 錯誤:缺少模板參數
};
#include <iostream>
using namespace std;
template <class T>
class Base {
public:
Base(T n) { cout << "Base constructor!\n"; id = n; }
virtual void toString() { cout << "my id is " << id << '\n'; }
protected:
T id;
};
template <class T>
class Derive : public Base<T>] {
public:
Derive(T n) : Base<T>(n) { cout << "Derive constructor!\n"; }
};
int main() {
Derive<int> d(5);
d.toString();
return 0;
}
錯誤:類‘Derive’沒有名為‘Base’的字段
錯誤:對‘Base::Base()’的調用沒有匹配的函數
備選:Base::Base(T) [with T = int] — 需要 1 實參
編譯器將 Base 視為非模板類別,找不到無參數構造函數。
「模板繼承調基構,模板參數不能漏」