2011-08-03 8 views
0

私は、型のないテンプレートパラメータを持つテンプレートメソッドを含むクラスを持っています。コードサイズが非常に大きくなったので、.cppファイルに挿入することでインライン展開を回避しようとしました。しかし、私は非型パラメータごとにそれを明示的にインスタンス化することしかできません。暗黙のテンプレートメソッドのインスタンス

暗黙的なインスタンス生成は可能ですか?それはどのように見えるでしょうか?他の関連する質問では、このリンクhttp://www.parashift.com/c++-faq-lite/templates.htmlが提供されるが、(このようなものがある場合)、私は暗黙のインスタンス生成のための解決策を見つけることができません...

class Example 
{ 
    public: 
    template<enumExample T_ENUM> void Foo(void); 
}; 

私はFooの(未解決の外部シンボル)のためのリンカエラーを取得しますそれを使用するとき。

+0

'コードサイズが本当に大きくなった 'とはバイナリサイズを意味しますか? – iammilind

+0

"だから私はインライン展開を.cppファイルに入れることで回避しようとしました" - おそらくはい。 –

+0

@iammilind、はい、バイナリサイズを意味します。この方法はそれほど簡単ではなく、私はそれを2回以上呼びます。 – Mirco

答えて

1

暗黙的なインスタンス化では、コンパイラは関数テンプレートの実装を確認する必要があります。通常これは、実装がヘッダファイル内にある必要があることを意味します。インライン展開を避けたいのであれば、関数テンプレートの実装をヘッダーに書くこともできますが、クラス宣言の外では(インライン展開が本当の問題かはわかりませんが)。

2

問題は、テンプレートコードがインスタンス化された時点で表示される必要があることです。 C++ FAQ 35.13

これは基本的にあなたがしようとしていることができないことを意味します。これを可能にするエクスポートキーワードがありますが、それは非常にサポートされておらず、私はC++ 0xの標準から削除されていると思います。詳細については、C++ FAQ 35.14を参照してください。

+0

実際には今後の標準から削除されました。現在の標準でそれを実装した唯一のベンダーは、削除のためにプッシュしました。そこで、そこに合意するための良い土台がありました。 –

0

コードサイズを小さくするには、適切な場合はpimpl idiomを実装して依存関係を減らすことができます。

関連する問題