template之類相關

前言

前面兩節主要分析了使用template的注意點以及非類型參數如何使用, 本節來探討虛模板函數和模板拷貝構造函數.

虛函數模板

在我們使用模板從來都沒有將虛函數與模板進行套用, 那麼這兩者能不能同時連用呢?

這個直接來寫代碼驗證才知道.

class point
{
	public:
		template<class T>
			virtual T getX()
			{
				return x;
			}
	private:
		int x;
};

int main()
{
	exit(0);
}

分別用了g++clang編譯

// g++
virtual_template.cpp:17:4: error: templates may not be ‘virtual’
    virtual T getX()
// clang
virtual_template.cpp:17:4: error: 'virtual' cannot be specified on member function templates
                        virtual T getX()

可以看出來clang更加準確的指出了virtual不能是member function templates.

爲什麼虛函數不能是模板函數?

  • 編譯器在編譯類的定義的時候就必須確定該類的虛表大小.
  • 模板只有在運行調用時才能確認其大小, 兩者衝突. 結果顯而易見.

模板拷貝構造函數

模板與不同模板之間不能直接的賦值(強制轉換), 畢竟模板一般都是類和函數都不是普通的類型. 但是類有拷貝構造函數, 所以我們可以對類的構造函數進行修改, 也就成了模板構造函數.

模板拷貝構造函數與一般的拷貝構造函數沒有什麼區別, 僅僅實在加了一個模板作爲返回值類型

template<class T>
class tmp
{
	public:
		tmp() : x(0) {}
		template<class U>
			tmp(const tmp<U>& t)
			{
				x = t.x;
			}
	private:
		T x;
};

int main()
{
	tmp<int> t1;
	tmp<char> t2;
	t1 = t2;

	exit(0);
}

總結

本節分析了類的虛表大小要在編譯時知道其大小所以虛函數不能爲模板函數, 模板構造函數與普通的構造函數寫法無意, 並且可以實現強制轉換的效果.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章