-2

「関数宣言でのテンプレートキーワードの使用」とはどういう意味ですか?

この例では、コンパイラエラーでエラーが発生します:「func」はテンプレート関数ではありません。

template<typename T>
struct Window {
  T value;
};

template void func(Window<int>, int);

template<typename T>
void func(Window<T>, T) {
}

int main(void) {
}

しかし、以下の例は問題ありません。

template<typename T>
struct Window {
  T value;
};

template<typename T>
void func(Window<T>, T) {
}

template void func(Window<int>, int);

int main(void) {
}

上記の場合の「テンプレート」の意味は何ですか?この関数がテンプレート関数であることを示しているだけですか?

4

2 に答える 2

0

これは、最初の例でテンプレートの定義があるからです。

template<typename T>
 void func(Window<T>, T) {
}

この行で表される強制インスタンス化の後:

template void func(Window<int>, int);

一方、2番目の例では、それらは正しい方法です。

しかし、あなたの質問へのコメントは公平です。あなたは基本的な質問(「テンプレートは何を意味するのか」)を尋ねています。それは主題の徹底的な研究によって最もよく答えられます。

于 2013-02-15T02:50:38.917 に答える
0

キーワードで始まり、直後に先のとがった中括弧templateがない宣言は、明示的なインスタンス化と呼ばれます。これは、テンプレート定義を検索し、指定されたテンプレートパラメーターをプラグインして、特定の関数の特殊化またはクラスの特殊化を取得することを意味します。したがって、最初の例では、コンパイラは、と呼ばれるテンプレートについてまだ何も知らないため、インスタンス化できないと文句を言っています。<>func(Window<int>, int)func

テンプレートは、使用を試みるだけで暗黙的にインスタンス化できるため、通常、明示的なインスタンス化は必要ありません。ただし、明示的なインスタンス化により、関連するリンカーシンボルが表示される場所と方法をある程度制御でき、場合によっては、テンプレート定義をヘッダーファイルからソースファイルに移動するために使用できます。

于 2013-02-15T03:12:13.143 に答える