[C++] 高度なテンプレート (テンプレートの特殊化、型以外のテンプレート パラメーター、テンプレートの個別のコンパイル)


1. テンプレートを使用する場合はタイプ名を追加する必要があります

template<class Container>
void Print(const Container& v)
{
    
    
	// 编译不确定Container::const_iterator是类型还是对象
	//错误示范: Container::const_iterator it = v.begin();(会报错)
	 // typename就是明确告诉编译器这里是类型,等模板实例化再去找
	 typename Container::const_iterator it = v.begin(); //正确
	 vector<int>::const_iterator it = v.begin();//正确
	// vector<int>的定义实例化出一个具体的类  ,然后到类中寻找const_iterator

	  
	while (it != v.end())
	{
    
    
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
class A
{
    
    
public:
	int begin()
	{
    
    
		return 0;
	}
	//静态成员变量在类外定义
	static int const_iterator;
};
//反例:
int A::const_iterator = 1;
//const_iterator为对象

2. 非型テンプレートパラメータ

type パラメータは、テンプレート パラメータ リストに表示され、その後に class や typename などのパラメータ タイプ名が続きます。
非型仮パラメータ: クラス(関数)テンプレートのパラメータとして定数を使用することであり、クラス(関数)テンプレート内でパラメータを定数として使用することができます。

ここに画像の説明を挿入

知らせ:

  1. 浮動小数点数、クラス オブジェクト、文字列は非型テンプレート パラメーターとして許可されません。
  2. 非型テンプレート パラメーターには、コンパイル時に確認された結果が必要です。

3. テンプレートの特化

1. 関数テンプレートの特化

関数テンプレートの特殊化手順は次のとおりです。

  1. 最初に基本的な関数テンプレートが必要です
  2. キーワード テンプレートの後には、空の山かっこ <> が続きます。
  3. 関数名の後には、特殊化する型を指定する 1 対の山括弧が続きます。
  4. 関数パラメータテーブル: テンプレート関数の基本パラメータ型と完全に同じである必要があります。異なる場合、コンパイラが奇妙なエラーを報告する可能性があります。

ここに画像の説明を挿入

2. クラステンプレートの特化

1.全特化:

完全な特殊化は、テンプレート パラメーター リスト内のすべてのパラメーターを決定することです。

ここに画像の説明を挿入

2. 部分的な専門化:

1. 部分特化

テンプレートパラメータクラスリスト内のパラメータの一部を特殊化します。

ここに画像の説明を挿入

2.パラメータはさらに制限されます

部分的特殊化とは、単に一部のパラメーターの特殊化を指すのではなく、テンプレート パラメーターの条件をさらに制限するために設計された特殊化された
バージョンを指します。

ここに画像の説明を挿入

4. テンプレートの個別コンパイル

個別コンパイルとは:
プログラム (プロジェクト) は複数のソース ファイルによって共同実装され、各ソース ファイルは個別にコンパイルされてオブジェクト ファイルが生成され、最後にすべてのオブジェクト ファイルを
リンクしてモード

1.スタック.h

ここに画像の説明を挿入

2.Stack.cpp (定義)

ここに画像の説明を挿入

3.test.cpp

ここに画像の説明を挿入
実行後にエラーが報告されます: (リンクエラー)
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
解決策:

  1. 実際には、宣言と定義をファイル「xxx.hpp」または xxx.h に入れることができます。これはお勧めです。
  2. テンプレート定義が明示的にインスタンス化される場合。この方法は非現実的であるため、お勧めできません。

おすすめ

転載: blog.csdn.net/m0_74774759/article/details/132009037