2011-07-29 45 views
2

我正嘗試使用BOOST庫構建一個簡單的GraphML加載器。我有一個GraphML文件,我想將它加載到一個boost鄰接列表結構中。該圖是直接的,它存儲的唯一信息是節點的名稱(0,1,2,...)以及從一個節點到另一個節點的邊緣。我所做的是:Boost read_graphml示例

void loadHierarchy(){ 
    // ... 
    std::ifstream inFile; 
    inFile.open("ext.gml", std::ifstream::in); 

    typedef boost::adjacency_list<> Graph; 
    Graph g; 

    boost::read_graphml(inFile, g); 
    // ... 
} 

我不需要使用任何屬性,只是爲了保持整個圖形信息在鄰接列表中。

,我得到的錯誤有以下幾種:

error: invalid initialization of reference of type ‘boost::mutate_graph&’ from expression of type ‘loadHierarchy()::Graph’

/usr/include/boost/graph/graphml.hpp:194: error: in passing argument 2 of ‘void boost::read_graphml(std::istream&, boost::mutate_graph&)’

它應該是這麼簡單,但顯然事實並非如此。

回答

1

我認爲你應該使用read_graphml()的3參數版本,即使你不需要設置任何屬性。您要使用的兩個參數版本是庫的內部細節(不幸暴露)。

所以,我建議你去嘗試這樣的事:

boost::dynamic_properties dp; 
boost::read_graphml(inFile, g, dp); 

我希望它幫助。

+0

它肯定幫了我,謝謝! – EddieBytes

1

經過更徹底的調查後,我得出結論,它實際上是幸運的boost :: read_graphml的2 param版本被暴露。 3 PARAM一個看起來是這樣的:

template<typename MutableGraph> 
void 
read_graphml(std::istream& in, MutableGraph& g, dynamic_properties& dp) 
{ 
    mutate_graph_impl<MutableGraph> mg(g,dp); 
    read_graphml(in, mg); 
} 

有一個特別好的GraphML編輯在那裏,即YED是輸出一種畸形GraphML文件,例如,它有一個像

<key for="node" id="d6" yfiles.type="nodegraphics"/> 

標籤它。上面的密鑰在其中應該有一個attr.type =「string」,但它沒有。它有一個yfiles.type,這似乎是yEd使用的擴展(不幸)。默認的mutate_graph_impl不能處理這個。 mutate_graph_impl將需要由您繼承,您需要直接調用2版本的read_graphml,並將您自己的mutate_graph_impl實現傳遞給它。 在自己的實現,你需要重寫mutate_graph_impl的

virtual void 
    set_vertex_property(const std::string& name, any vertex, const std::string& value, const std::string& value_type) 

處理與未指定attr.type的關鍵。

相關問題