2010-11-17 94 views
0

我正在使用Boost圖庫,並在此基礎上構建自己的類。獲取/推導返回值的模板函數中的類型

現在,我有以下功能:

template< class VERTEXPROPERTIES > 
VERTEXPROPERTIES& properties(const Vertex& v) const 
{ 
    typename property_map<FilteredGraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph_); 

    return param[v]; 
} 

當我使用這個功能的類模板是這樣的:

template< class VERTEXPROPERTIES, class EDGEPROPERTIES > 
class Graph 
{ 
// all the code 
}; 

它的工作原理。 然而,當我想用​​它在一類這樣的:

template < class GRAPH, class EDGE_PREDICATE, class VERTEX_PREDICATE > 
class FilteredGraph 
{ 
// all the code 
}; 

和應用性能()函數將FilteredGraph對象,編譯器抱怨說,它無法找到該功能。
據我迄今發現,這可能是由於在參數列表中缺少模板參數。
對於Graph類,這個模板參數很容易找到,因爲它在創建Graph對象時被定義。
但是對於FilteredGraph,它應該能夠從GRAPH-template參數中推導出它。
然後,我認爲,編譯器會有問題得到正確的返回值類型,因爲這可能有必要事先找出...
我真的很想保留這個概念與屬性()函數因爲它允許保持通用的其他功能。
你有什麼想法如何解決這個問題,可能保持這個概念?

+1

請發佈編譯錯誤和類定義。你給我們**沒有**信息。 – 2010-11-17 10:38:39

+0

我對此表示歉意。我沒有在這裏發表,因爲我覺得它只會混淆這個問題。編譯器錯誤只是它找不到在我的代碼中使用的函數。我能夠將它修復爲由boost庫提供的property_traits功能。我會單獨發佈答案。 – Shadow 2010-11-17 12:25:09

+0

不用擔心。我不會混淆這個答案。編譯錯誤通常非常有用。有時候有點神祕,但非常經常,非常精確。 – 2010-11-17 13:13:11

回答

0

再一次,我不提供更多信息的道歉。
在我看來,編譯器無法在那裏推斷依賴類型。在使用模板之前,我曾經遇到過這個問題。
我會在這裏提供修復以防有人遇到類似問題。

FilteredGraph使用Graph的實例(基本上是一個具有內部自定義屬性的adjacency_list)作爲其輸入。 Graph類有兩個模板參數,一個用於頂點的屬性,另一個用於邊的屬性。
作爲一個小旁註,使用捆綁屬性(不支持老版本的boost圖庫,也不支持某些編譯器),我認爲,這個問題可以繞過,因爲你不需要額外的函數返回一個值可能)未知類型。 由於需要爲某些特定類型的頂點/邊緣屬性指定傳遞給FilteredGraph的Graph對象,因此可以實際提取此信息。
通過我實現了這個:

/// Type of the internal properties of the edges 
typedef typename property_traits< typename property_map<FilteredGraphContainer, vertex_properties_t>::type >::value_type VProps; 
/// Type of the internal properties of the edges 
typedef typename property_traits< typename property_map<FilteredGraphContainer, edge_properties_t>::type >::value_type EProps; 

然後定義:再次

VProps& properties(const Vertex& v) 
{ 
     typename property_map<FilteredGraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph_); 
     return (param[v]); 
} 

感謝您對這個問題的興趣,我很抱歉沒有提供更多的信息。

此致敬禮。

+0

您可以使用問題左側的勾號接受您的答案(包括您自己的答案)。這標誌着問題的答案已經解決,並使得有相同問題的其他人更容易找到解決方案。 – 2010-11-17 13:07:45

+0

我認爲你應該使用更多的typedef。你的代碼行很長。 – 2010-11-17 13:32:18

+0

關於「接受你的答案」,它說我只能標記爲在兩天內解決。感謝提示。 – Shadow 2010-11-17 13:44:03

相關問題