2011-10-31 5 views
1

私は自分のクラスを退治しようとしていますboost :: adjacency_matrixグラフをメンバーとして取得しましたが、コンパイルエラーが発生しました。自分のクラスでブーストグラフをラップすることはできますか?

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 :: 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に引数を取らないコンストラクタがないことを伝えているので、クラスのメンバとして構築することはできません。クラスのオブジェクトメンバーは、包含するクラスが構築されるのと同時に構築されなければなりません。そうでなければ、コンパイラは、コールできるパラメータを持たないコンストラクタがあるとみなします。存在しない場合、このようなエラーが発生します。

ソリューションは、あなたのコンストラクタの初期化子リスト内グラムのコンストラクタのパラメータを提供することです:... adjacency_matrixのコンストラクタの一つは、あなたがしたいオブジェクトあなたを取得何のための適切なコンストラクタのパラメータである

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

。これは、コンパイラのデフォルトの本能をオーバーライドして、0パラメータのコンストラクタを呼び出そうとし、代わりに指定したパラメータと一致するものを呼び出します。

あなたのクラスの構築時にそれをしたくない場合は、そのクラスへのポインタを保存し、適切なタイミングでnewを使用して構築する必要があります。それとも、shared_ptrを格納しておくと、クラスが破棄されたときに削除することを心配する必要がなくなります。

0

私の知る限り、Graphのデフォルトコンストラクタはありません。

パラメータを指定する必要があります。documentationを参照してください。

関連する問題