我希望有两个指向彼此的结构。具体来说,我想拥有以下内容:
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来做这件事,但我正在尝试用正确的方法做事:)
谢谢!
答案 0 :(得分:3)
虽然我怀疑这可能是重复的(并且在很多方面都是如此),“干杯和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,所以它可以是前向声明的。
答案 1 :(得分:0)
遗憾的是,这是不可能的,就像你表达它一样。
另一方面,在我看来(根据您的要求)您可以撤销存储。
如果您使用list
的{{1}},然后将地图指向此列表,该怎么办?
这会打破循环依赖。
Values
(不确定我是否真的明白你想要实现的目标......)
您应该考虑的另一个解决方案是看看您是否可以用Boost.MultiIndex来表达这一点。当需要多个迭代/查找模式时,Boost.MultiIndex通常是比手工解决方案更好的替代方案,因为它在值内交错索引以便最小化存储。加上一致性(即,所有索引都引用相同的元素集)是给定的。