2

私の質問は、テンプレートの明示的なインスタンス化宣言を正しい方法で使用するにはどうすればよいですか?

テンプレート クラス があるとしtemplate<class T> Fooます。

この機能に対処する方法は次のとおりです。

テンプレートの宣言をFoo.hファイルに入れ、実装をファイルに入れFoo.inl、これFoo.inlをファイルの最後に含め、. また、たとえばファイルで明示的なテンプレートのインスタンス化定義を使用する必要があります (もちろん、この cpp ファイルにも含める必要があります)。Foo.hextern template class Foo<int>;#include "Foo.inl"Foo.cppFoo.h

これらすべてを行うと、エラーが発生します。明示的なテンプレートのインスタンス化宣言の直後に明示的なテンプレートのインスタンス化定義を使用することはできません。わかりました、テンプレート宣言とを別のファイルに入れて、に含めましょう。最終的に次のようになりました。#include "Foo.inl"Foo.hppFoo.cpp

Foo.hpp

template<class T>
class Foo
{
public:
  Foo();
  ...
};

#include "Foo.inl"

Foo.inl

template<class T>
Foo<T>::Foo() {}

フー。

#include "Foo.hpp"
extern template class Foo<int>;

Foo.cpp

#include "Foo.hpp"
template class Foo<int>;

そして、このテンプレートを次のように使用します。

test1.cpp

#include "Foo.h"
void bar()
{
  Foo f;
}

Fooが多すぎませんか?これにどのように対処しますか?

私の英語でごめんなさい。

アップデート:

問題は、明示的なテンプレートのインスタンス化の定義やテンプレート コード自体の構成方法に関するものではなく、明示的なテンプレートのインスタンス化宣言の使用法と、それを使用しようとすると生成される「ファイル地獄」に関するものです。

4

0 に答える 0