7

いくつかの型を宣言したいと思います(テンプレート化されたクラスの内部で、KキャッシングV動作を提供します):

typedef std::map<
  long long,
  typename key_to_value_type::iterator  // Ooops... not declared yet
> timestamp_to_key_type;

typedef std::map<
  K,
  std::pair<V,typename timestamp_to_key_type::iterator> 
> key_to_value_type;

もちろん、循環定義のため、これはそのままでは不可能です。でハックすることもできますが、void*前方宣言の魔法や、より良い仕事をする他のテクニックがあるかどうか疑問に思っています。

(はいboost::bimap、問題を回避することは承知しています)。

4

2 に答える 2

7

それは不可能です。タイプが何であるかを検討してください:

timestamp_to_key_type
= map< long long, key_to_value_type::iterator >
= map< long long, map< K, pair< V, timestamp_to_key_type::iterator > >::iterator >
= map< long long, map< K, pair< V, map< long long, map< K, pair< V, map< long long, map< K, pair < V ...

これは前方宣言の問題ではありません。それ自体で再帰的に定義された型を記述しようとしているだけです。それは以下と違いはありません:

struct A { B b; };
struct B { A a; };

これを回避する唯一の方法は、いくつかの静的型情報を失うことです。あなたが言ったように、を使用するvoid*か、独自の抽象型消去インターフェイスを定義しようとすることができます。あなたの選択。

于 2010-11-12T22:38:37.563 に答える
1

1 つだけが V を含み、もう 1 つが反復子を含む循環定義を解除します。

typedef map<K, V> KVMap;
typedef map<long long, typename KVMap::iterator> TSMap;

キーを使用してタイムスタンプを検索する必要があり、そのタイムスタンプが V に保存されていない場合は、KVMap でそれを複製できます。

typedef map<K, pair<V, long long> > KVMap;

K から、KVMap::find を使用してタイムスタンプを取得し、次に TSMap::find を使用して対応する項目のハンドルを取得できます (たとえば、消去するため)。

于 2010-11-13T00:17:24.387 に答える