のは、私は次のコードがあるとしましょう:テンプレートクラスは、C++のさまざまなコンパイル単位で複数回コンパイルされていますか?
// templateClass.h
#ifndef TEMPLATE_CLASS_H
#define TEMPLATE_CLASS_H
template <typename T>
class tClass
{
public:
tClass();
};
#endif
// templateClassDef.inl
#ifndef TEMPLATE_CLASS_DEF_INL
#define TEMPLATE_CLASS_DEF_INL
template <typename T>
tClass<T>::tClass()
{
}
#endif
// normalClass.h
#include "templateClass.h"
class normal
{
public:
normal();
};
// normalClass.cpp
#include "normalClass.h"
#include "templateClassDef.inl"
normal::normal()
{
tClass<int> a;
}
// main.cpp
#include "templateClass.h"
#include "templateClassDef.inl"
#include "normalClass.h"
int main()
{
tClass<int> a;
normal b;
return 0;
}
注意inl
ファイルは、それが通常であるように、ヘッダに含まれていませんが、その代わりに、ソースファイルに含まれていることを(私はそれがない承知しています標準的な方法...これは単なる例です)。 normalcClass.cpp
がtClass<int>
をインスタンス化しているので、main.cpp
であることに注意してください。
私は両方のインスタンスが別々の翻訳単位で発生していてもコンパイラは、テンプレートクラスから、それはそれは同じタイプ(すなわちtClass<int>
)で考えると、明示的なインスタンスに遭遇するたびに、インスタンスを構築するために持っているかどうかの好奇心(normalClass.cpp
およびmain.cpp
)?また、これはコンパイル時に増加するでしょうか(前の質問に対する答えがであれば、それは再びをインスタンス化します)、これもはいであるべきですか?
これはコンパイラに依存しますが、答えは両方の質問に対してyesです –