2016-10-12 12 views
1

ライブラリを自分のクラスデザインにラッピングしています。私は、クラスのコンストラクタのライブラリで提供されるunsigned int非型パラメータを持つテンプレートメソッドを呼びたいと思います。非形式のテンプレート引数ソースファイル内の明示的なインスタンス化

#include <iostream> 
#include <bar.h> // template header in here 
class foo { 
    foo(unsigned num) { 
     BAR<num>(); // a template method BAR inside "bar.h" 
    } 
}; 

私はこれで対処しようとすると、非タイプのパラメータがconstexprであるようです。したがって、上記のコードは、関数呼び出しの中にconstエラーがあることを示すエラーを生成します。

私はfooクラスをクラステンプレートにして、このunsigned non-typeパラメータをfooのテンプレート引数パラメータに渡すことにしました。

#include <iostream> 
#include <bar.h> // template header in here 
template <unsigned num> 
class foo { 
    foo() { 
     BAR<num>(); // a template method BAR inside "bar.h" 
    } 
}; 

これはうまくいくようです。しかし、ヘッダーとソースファイルを別々の.hpp/.cppファイルに分けたいと思います。 this threadによると、.cppソースファイル内にテンプレート実装を配置する場合、.cppファイルの最後にすべてのテンプレート引数を明示的にインスタンス化する必要があります。符号なし整数のような非型パラメータの場合、それは、すべての符号なし数値オブジェクトに対してテンプレートを利用できるようにするために、何千もの可能な符号なし整数をインスタンス化する必要があるということですか?助けてくれてありがとう。

答えて

0

テンプレートクラスの実装をソースファイルに分けることはお勧めしません。あなたの状況を正しく理解していれば、unsignedでは不可能なテンプレートパラメータのすべての値をインスタンス化しないかぎり、それを行うことはできないと思います。

+0

テンプレート引数として非型を使用したい場合は、テンプレート実装を公開する必要がありますか? – yc2986

+0

はい私はそう信じている – grigor

+0

私はまだ実装を分離したい。この場合、constexprをコンストラクタのパラメータとして渡す別の方法はありますか? – yc2986

関連する問題