2012-03-08 183 views
2

我想有两个结构指向彼此。具体来说,我想有以下几点:C++相互模板依赖?

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来做到这一点,但我试图让事情成为正确的方式:)

谢谢!

+5

那个数据结构对我来说是无稽之谈。我的意思是在大多数情况下已经比使用'list'更无意义了。 (你实际上试图用这个数据结构来完成什么?) – 2012-03-08 07:59:54

+4

这是一个[重复](http://stackoverflow.com/q/9595420/777186)? – jogojapan 2012-03-08 08:05:28

+0

我想要一个地图,给定一个键,有一个值列表。这些值在列表中也有表示,我将其用于其他目的。目的是能够以插入顺序迭代所有地图的元素,而不是本地地图存储它们的顺序。 编辑:比利:我做了一个小小的改变,也许结构现在更有意义了?现在,ListType元素指向的是地图中某个列表中的元素。 – 2012-03-08 08:11:29

回答

3

尽管我怀疑这可能是重复的(并且在很多方面都是这样),“干杯和热情 - 阿尔夫”正确地指出潜在的重复问题是关于使用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,它可以被前向声明。

+0

我......认为这有效:)谢谢,我会尝试一下并验证。 – 2012-03-08 08:34:58

+1

@FedericoLebrón,如果您发现该回答有用,您可以通过点击下面的标签来接受它。 – iammilind 2012-03-08 09:00:27

+0

是的,只是测试它,它做我所需要的,谢谢! – 2012-03-08 09:20:32

0

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

另一方面,在我看来(根据您的要求),您可以调换存储空间。

如果您使用Valueslist,然后让地图指向此列表,该怎么办?

这将打破循环依赖。

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

(不知道我是否真的明白你试图实现,虽然...)

你或许应该考虑的另一个解决方法是看你能不能在Boost.MultiIndex来表达这一点。当需要多个迭代/查找模式时,Boost.MultiIndex通常是比手工解决方案更好的替代方案,因为它在值内交织索引以最小化存储。 Plus的一致性(即,使所有索引引用同一组元素)是给定的。