0

私は一種のテンプレート化された階層に関連する指標をたくさん持っています。

template <int level>
struct index{
    index<level - 1> w;
    int x, y;
};

template <> struct index<0> { int x, y; };

template <int level>
struct data;

そして、それらによってインデックス付けされたオブジェクトを生成してキャッシュすることになっているクラス。このクラスに pimpl を使用したいのですが、テンプレートを使用して関数呼び出しを実装クラスに転送する方法があるかどうか疑問に思っています。何かのようなもの

class Cache{
    template <int level>
    shared_ptr<data<level>> get_data(const index<level> & index);
};  
4

1 に答える 1

1

要するに、いいえ(私があなたの質問を正しく理解している場合)。

問題は、フォワーダーの実装の時点で、実装クラスの完全な定義(宣言だけでなく)が必要になることです。この目的でテンプレートメンバー関数を使用する場合は、それらを使用するすべてのコンパイルユニットで、つまり通常は宣言するのと同じヘッダーでそれらを定義する必要があります。つまり、実装クラスは、インターフェイスクラスを宣言するのと同じヘッダーで定義する必要があります(これにより、最初にクラスを単純化する目的が無効になります)。

(コンパイラがexportキーワードをサポートしている場合は、テンプレートメソッドを個別に定義できるため、この場合は機能します。実際には、Comeauはサポートしている唯一のコンパイラでexportあり、C ++ 11から完全に削除されています)。

比較テンプレート関数でリンカーエラーを回避するにはどうすればよいですか?C++-FAQ-liteで。

于 2012-04-06T17:56:45.087 に答える