2

お互いを指す 2 つの構造が必要です。具体的には、次のことを実現したいと考えています。

template<typename Key, typename Value> 
class MyStructure {
public:
  typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
  typedef list<typename MapType::element_type::iterator> ListType;
private:
  MapType map_;
  ListType list_;
}

ListType は以前に型として宣言されていないため、明らかにこれは機能しません。どうすればこれを行うことができますか? ご覧のとおり、イテレータ型をこれら 2 つの構造体の要素へのポインタとして使用しています。

奇妙に繰り返されるテンプレート パターンを使用することを考えていましたが、それではどこにも行きませんでした。##c++ の誰かもテンプレート エイリアスの使用を提案しましたが、それも失敗しました (少なくとも、このアイデアの使用方法はわかりません)。

概念的に何か間違ったことをしていますか? それとも「C++ の概念に沿っていない」のでしょうか? 私は確かに void*s でこれを行うことができましたが、私は物事を正しい方法にしようとしています:)

ありがとう!

4

2 に答える 2

3

これは重複している可能性があると思いましたが (多くの点で重複しています)、"Cheers and hth. - Alf" は、重複する可能性のある質問が特にtypedefこの種の の使用に関するものであることを指摘するのは正しいことです。

ただし、現在の質問では、OPは、質問で説明されているシナリオで相互包含を一般的にどのように処理するかを知りたいと考えています。

ここに提案があります:

#include <list>
#include <map>

template <typename Key, typename Value>
class MyElement;

template <typename Key, typename Value>
class MyStructure
{
public:
  typedef std::map<Key,MyElement<Key,Value> > MapType;
  typedef std::list<MyElement<Key,Value> >    ListType;
};

template <typename Key, typename Value>
class MyElement {
public:
  typename MyStructure<Key,Value>::MapType::iterator  map_iterator;
  typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};

ご覧のとおりMyElement、リスト反復子とマップ反復子を含む新しいデータ型 を導入しました。これは typedef ではなくクラスであるため、前方宣言できます。

于 2012-03-08T08:27:28.603 に答える
0

残念ながら、あなたがそれを表現する方法では、これは不可能です。

一方、(要件を考えると)ストレージを元に戻すことができるように思えます。

のを使用してから、マップがこのリストを指すようにした場合はどうなるlistでしょValuesうか。

これにより、循環依存関係が解消されます。

typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;

(あなたが達成しようとしていることを本当に理解しているかどうかはわかりません...)

おそらく考慮すべきもう 1 つの解決策は、これをBoost.MultiIndexで表現できるかどうかを確認することです。複数の反復/ルックアップ パターンが必要な場合、Boost.MultiIndex は多くの場合、手作りのソリューションよりも優れた代替手段です。これは、ストレージを最小限に抑えるために値内のインデックスをインターリーブするためです。さらに、一貫性 (つまり、すべてのインデックスが同じ要素のセットを参照すること) が与えられます。

于 2012-03-08T08:23:32.213 に答える