記事ディレクトリ
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 などのパラメータ タイプ名が続きます。
非型仮パラメータ: クラス(関数)テンプレートのパラメータとして定数を使用することであり、クラス(関数)テンプレート内でパラメータを定数として使用することができます。
知らせ:
- 浮動小数点数、クラス オブジェクト、文字列は非型テンプレート パラメーターとして許可されません。
- 非型テンプレート パラメーターには、コンパイル時に確認された結果が必要です。
3. テンプレートの特化
1. 関数テンプレートの特化
関数テンプレートの特殊化手順は次のとおりです。
- 最初に基本的な関数テンプレートが必要です
- キーワード テンプレートの後には、空の山かっこ <> が続きます。
- 関数名の後には、特殊化する型を指定する 1 対の山括弧が続きます。
- 関数パラメータテーブル: テンプレート関数の基本パラメータ型と完全に同じである必要があります。異なる場合、コンパイラが奇妙なエラーを報告する可能性があります。
2. クラステンプレートの特化
1.全特化:
完全な特殊化は、テンプレート パラメーター リスト内のすべてのパラメーターを決定することです。
2. 部分的な専門化:
1. 部分特化
テンプレートパラメータクラスリスト内のパラメータの一部を特殊化します。
2.パラメータはさらに制限されます
部分的特殊化とは、単に一部のパラメーターの特殊化を指すのではなく、テンプレート パラメーターの条件をさらに制限するために設計された特殊化された
バージョンを指します。
4. テンプレートの個別コンパイル
個別コンパイルとは:
プログラム (プロジェクト) は複数のソース ファイルによって共同実装され、各ソース ファイルは個別にコンパイルされてオブジェクト ファイルが生成され、最後にすべてのオブジェクト ファイルを
リンクしてモード。
1.スタック.h
2.Stack.cpp (定義)
3.test.cpp
実行後にエラーが報告されます: (リンクエラー)
解決策:
- 実際には、宣言と定義をファイル「xxx.hpp」または xxx.h に入れることができます。これはお勧めです。
- テンプレート定義が明示的にインスタンス化される場合。この方法は非現実的であるため、お勧めできません。