2011-10-31 28 views
1

我正在嘗試使用boost :: adjacency_matrix圖形作爲成員來嵌套自己的類,但是我在編譯時出錯。 Sample類不會編譯:我是否可以用自己的類來包裝增強圖形

namespace zto { 

typedef boost::adjacency_matrix<boost::undirectedS> Graph; 

class SampleClass 
{ 
public: 
    Graph g; 
    SampleClass(); 
}; 

而且編譯錯誤:

./src/sample.cpp: In constructor ‘zto::SampleClass::SampleClass()’: 
./src/sample.cpp:27:31: error: no matching function for call to 
    ‘boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix()’ 
./src/sample.cpp:27:31: note: candidates are: 
/usr/include/boost/graph/adjacency_matrix.hpp:622:5: note: template<class EdgeIterator, 
    class EdgePropertyIterator> boost::adjacency_matrix::adjacency_matrix(EdgeIterator, 
    EdgeIterator, EdgePropertyIterator, boost::adjacency_matrix<Directed, VertexProperty, 
    EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&) 
/usr/include/boost/graph/adjacency_matrix.hpp:604:5: note: template<class EdgeIterator> 
    boost::adjacency_matrix::adjacency_matrix(EdgeIterator, EdgeIterator, 
    boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, 
    Allocator>::vertices_size_type, const GraphProperty&) 
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note: 
    boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty, 
    Allocator>::adjacency_matrix(boost::adjacency_matrix<Directed, VertexProperty, 
    EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&) 
    [with Directed = boost::undirectedS, VertexProperty = boost::no_property, EdgeProperty 
    = boost::no_property, GraphProperty = boost::no_property, Allocator = 
    std::allocator<bool>, boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, 
    GraphProperty, Allocator>::vertices_size_type = unsigned int] 
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note: candidate expects 2 
    arguments, 0 provided 
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note: 
    boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix(const 
    boost::adjacency_matrix<boost::undirectedS>&) 
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note: candidate expects 1 
    argument, 0 provided 

它看起來像compilator認爲是一個功能?

有人可以告訴我,如何聲明boost :: adjacency_matrix作爲我的班級的成員?

回答

0

如果不指定其他任何內容作爲初始值設定項,則該類的對象成員將使用默認構造函數初始化。看來,adjacency_matrix沒有默認的構造函數。

你應該做這樣的事情,而不是:

的typedef的boost :: adjacency_matrix圖;

class SampleClass 
{ 
public: 
    Graph g; 
    SampleClass(size_t arg) 
    : g(arg) // this is important 
    { 
     // As before, can also be in a cpp. 
     // It is just important that the initializer is used. 
    } 

}; 

當然,在實踐中你也可以利用其他的構造函數的參數,使用你贏了默認值,等等。這應該只是一個很簡單的例子。我從來沒有使用boost :: adjecency_matrix,所以我不知道好的練習和真正有意義的東西。我只是從錯誤信息中獲取了這個信息。

+0

thx很多,這解決了我的問題。 – miszczu

0

編譯器告訴你boost :: adjacency_matrix沒有一個沒有參數的構造函數,所以它不能構造一個作爲你的類的成員。類的對象成員必須在構造包含類的同時構造,除非另有指定,否則編譯器會假定沒有可調用的參數的構造函數。如果沒有,你會得到這樣的錯誤。

的解決方案是爲克氏在構造函數的初始化列表構造器提供參數:

SampleClass() : g(...) 
{ 
} 

凡......是什麼adjacency_matrix的一個構造得到你想要的對象適當的構造函數的參數。這將覆蓋編譯器的默認本能以嘗試調用0參數構造函數,並使其調用與您提供的參數相匹配的任何一個。

如果你不想在你的班級的施工時間這樣做,你將不得不存儲一個指向它的指針,並在適當的時候使用new來構造它。或者更好的是,將shared_ptr存儲到它,以便在您的類被銷燬時不必擔心刪除它。

0

據我瞭解,Graph沒有默認構造函數。

您應該提供一個參數,所以請參考documentation

相關問題