0

テンプレート関数を 1 つのファイルで定義し、多くのファイルで使用したいと考えています。これは、通常の関数プロトタイプと同じように機能しますか? それで、一度定義して、プロトタイプを他のファイルに含めることができますか? クラスについても同じ質問があります。クラスの場合と同様に、テンプレート クラスの完全な定義を各ヘッダー ファイルに含める必要がありますか? 別のファイルでテンプレート関数を 2 回定義すると、エラーが発生するのでしょうか。それとも、チェックされないだけでしょうか。

もう 1 つの質問ですが、テンプレート関数のプロトタイプの形式は何ですか?

4

2 に答える 2

4

いいえ、通常の関数と同じではありません。通常の関数を使用すると、宣言できます

void foo(int);
void foo(double);

ヘッダーで、 などのソース ファイルで関数を定義し、 などのfoo.cc関数を使用する必要があるソース ファイルにヘッダーを #includebar.ccし、残りはリンカーに任せます。コンパイラは、関数がどこかに定義されていることを確信して をコンパイルbar.ccして生成bar.oします。定義していない場合は、リンク時エラーが発生します。

ただし、テンプレートを使用している場合:

template <typename T>
void foo(T) ...

それがどのように機能するか想像してみてください。ソース ファイルfoo.ccとソース ファイルbar.ccは独立しており、お互いについて何も知りませんが、両方が #include するヘッダーの内容に同意することを除きます (これが全体的な考え方です)。そのため、実装bar.cc方法がわからず、これらの関数で何ができるかわかりません。このシナリオでは、 はT に指定するを知りません。では、太陽の下ですべての型名の定義をどのように持つことができるのでしょうか?foo.ccfoo.ccbar.ccfoo.ccbar.ccfoo.cc

できないため、このアプローチは許可されません。ヘッダーにテンプレート全体を含める必要があります。これにより、コンパイラはfoo(int)、 またはfoo(string)、 またはfoo(myWeirdClass)、または必要なものの定義をbar.cc作成し、それをビルドできますbar.o(または、テンプレートがその型に対して意味をなさない場合は文句を言います)。

クラスについても同様です。

テンプレートの特殊化ではルールが少し異なりますが、高度なテクニックを試す前に、基本をよく理解する必要があります。

于 2011-04-25T05:10:53.713 に答える
2

このFAQを参照してください。特に、項目12、13、14は、テンプレート関数の宣言と定義の分離を扱っています。

于 2011-04-25T05:06:45.350 に答える