namespace myspace6 { template<typename T1> class TC { public: template<typename T2> TC(T2 v1, T2 v2) { cout << "TC(T2 v1,T2 V2)被執行了" << endl; } TC(T1 v1,T1 v2) { cout << "TC(T1 v1,T1 v2)被執行了" << endl; } TC(double v1, double v2) { cout << "TC(double v1, double v2)被執行了" << endl; } }; } int main(int argc, char** argv[]) { myspace6::TC<float> one(1,2); myspace6::TC<float> two(11.1f,12.3f); myspace6::TC<float> three(1.1,2.4); while (1); return 0; }
輸出結果:
加入構造函數模板:
namespace myspace6 { template<typename T1> class TC { private: T1 data; public: template<typename U> TC(const TC<U>&) { cout << "構造函數模板被執行了" << endl; } void getData() { cout << "data=" << data << endl; } void SetData(T1 x) { data = x; } template<typename T2> TC(T2 v1, T2 v2) { cout << "TC(T2 v1,T2 V2)被執行了" << endl; } TC(T1 v1,T1 v2) { cout << "TC(T1 v1,T1 v2)被執行了" << endl; } TC(double v1, double v2) { cout << "TC(double v1, double v2)被執行了" << endl; } }; } int main(int argc, char** argv[]) { myspace6::TC<float> one(1,2); myspace6::TC<float> two(11.1f,12.3f); myspace6::TC<float> three(1.1,2.4); three.SetData(2); myspace6::TC<float> four(three); four.getData(); while (1); return 0; }
輸出:
這里可以發現,並沒有調用構造函數模板,原因是在構造函數模板中,兩個對象的類型不同,而這里的兩個對象的類型相同,也就是實際想要調用的是構造函數。但是這里並沒有定義構造函數,由於有成員變量,系統采用的是值初始化的方式,換句話說,也就是編譯器實際上並沒有為我們合成默認的構造函數,因為對於普通的成員變量而言,編譯器內部有一定的規則,可以不用調用構造函數,對這些成員變量的初始化同樣能夠進行。所以這里顯示的就是2了。
如果把這里的const去掉,那么情況就會不一樣,這是一條規則,如果沒有const修飾,那么不管類型相同或者不相同,都會調用構造函數模板.