2012-03-08 189 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的一致性(即,使所有索引引用同一組元素)是給定的。