クラステンプレート、たとえばVector<typename T>
を書きますとします。私はusing fvec = Vector<float>;
とusing dvec = Vector<double>;
を私のクライアントに公開したいと思っています。C++クラスのテンプレートインスタンスをコンパイルすることは可能ですか?
Vector
のテンプレートがどのように実装されているかを知りたいのであれば、fvec
とdvec
とプリコンパイルされたファイルの存在のみを知る必要があります。
クラステンプレート、たとえばVector<typename T>
を書きますとします。私はusing fvec = Vector<float>;
とusing dvec = Vector<double>;
を私のクライアントに公開したいと思っています。C++クラスのテンプレートインスタンスをコンパイルすることは可能ですか?
Vector
のテンプレートがどのように実装されているかを知りたいのであれば、fvec
とdvec
とプリコンパイルされたファイルの存在のみを知る必要があります。
クライアントだけのヘッダーファイルと実装をdoubleとfloatの両方で提供したい場合は、テンプレートクラスをcppファイルに明示的にインスタンス化できます。
http://en.cppreference.com/w/cpp/language/class_template
あなたは簡単な使用方法についてのcppファイル
template class Vector<float>;
template class Vector<double>;
にこのような何かを必要とする、あなたはまた、時間ファイルにいくつかのtypedefを行うことができます - 誰かが「四」タイプ(libquadmath)
でそれを使用することを決定した可能性があるため、これがありますあるいは、テンプレートから継承したhファイルにさらに多くのクラスターを作成することもできますが、これはtypedefと同じです。
ここには、構築して実行する簡単なプログラムがあります。クラステンプレートFoo
の実装はFoo.ccに隠されています。構築するための
がfoo.h
#pragma once
template <typename T> class Foo
{
public:
Foo();
void test();
};
template class Foo<float>;
template class Foo<int>;
Foo.cc
#include "Foo.h"
#include <iostream>
template <typename T> Foo<T>::Foo()
{
}
template <typename T> void Foo<T>::test()
{
std::cout << "Came to Foo<T>::test\n";
}
main.cc
#include "Foo.h"
int main()
{
Foo<int> f1;
f1.test();
Foo<float> f2;
f2.test();
// Uncommenting these lines results in linker error.
// Foo<double> f3;
// f3.test();
}
コマンド:
g++ -Wall -std=c++11 Foo.cc main.cc -o program
私も使用して構築することができる午前:
g++ -Wall -std=c++11 -c Foo.cc
g++ -Wall -std=c++11 -c main.cc
g++ -Wall -std=c++11 Foo.o main.o -o program
あなたはfoo.hのとFoo.o.を含むライブラリを出荷することができますあなたのクライアントはFoo<int>
とFoo<float>
を使用するように制限されます。
@ Jean-FrançoisFabreうわー、Vectorは単なる名前にすぎず、 'std :: vector'を再考するのは私の関心事ではありません。 –
あなたは私が推測する実装クラスとしてあなたのテンプレートを使用する必要があります。 –
Lucの答え[here](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)の下部を参照 –