我想有两个互相指向的结构。具体来说,我希望有以下内容:

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以前没有声明为类型。我怎么能这样做?正如你所看到的,我正在使用迭代器类型作为指向这两个结构元素的指针。

我正在考虑使用奇怪的重复模板模式,但无法得到任何地方。##C++上有人也建议使用模板别名,但也失败了(至少,我不知道如何使用这个想法)。

我在概念上做错了什么吗?或者也许"不符合C++概念"?我当然可以用void*s做到这一点,但我试图让事情以正确的方式:)

谢谢!

有帮助吗?

解决方案

虽然我怀疑这可能是一个重复的(并且在许多方面它是),"干杯和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,所以它可以向前声明。

其他提示

不幸的是,这是不可能的,在你表达它的方式。

另一方面,在我看来,(鉴于您的要求)您可以反转存储。

如果你用了一个 listValues, ,然后让地图指向这个列表?

这将打破循环依赖。

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

(不知道我是否真的明白你试图实现的目标。..)

你可能应该考虑的另一个解决方案是看看你是否可以用 升压。多索引.当需要多次迭代/查找模式时,Boost。MultiIndex通常是比手工解决方案更好的替代方案,因为它在值内交错索引,以便最大限度地减少存储。加一致性(即,具有引用相同元素集的所有索引)是给定的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top