2016-12-09 9 views
0

クラステンプレート、たとえばVector<typename T>を書きますとします。私はusing fvec = Vector<float>;using dvec = Vector<double>;を私のクライアントに公開したいと思っています。C++クラスのテンプレートインスタンスをコンパイルすることは可能ですか?

Vectorのテンプレートがどのように実装されているかを知りたいのであれば、fvecdvecとプリコンパイルされたファイルの存在のみを知る必要があります。

+0

@ Jean-FrançoisFabreうわー、Vectorは単なる名前にすぎず、 'std :: vector'を再考するのは私の関心事ではありません。 –

+0

あなたは私が推測する実装クラスとしてあなたのテンプレートを使用する必要があります。 –

+1

Lucの答え[here](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file)の下部を参照 –

答えて

0

クライアントだけのヘッダーファイルと実装を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と同じです。

0

ここには、構築して実行する簡単なプログラムがあります。クラステンプレート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>を使用するように制限されます。

+1

テンプレートクラスFoo ; テンプレートクラスFoo ; これらも.ccファイルに入れることができます。 – Nick

+1

@ニック、それも機能します。私はまだ彼らの中にいるのが好きです。'Foo'は' int'と 'float'と一緒に使うことができ、それ以外のものは使用できません。 –

+0

はい、あなたの方法ははるかに優れています。 – Nick

関連する問題