3

Boost Graphics Library の adjacency-list の使用に問題があります。循環依存の問題のようです: クラス A を使用するテンプレートの typedef T があります。さらに、A は型 T のオブジェクトへのポインターを格納します。コンパイラは、T が型に名前を付けていないことを教えてくれます。

以下は、より具体的なファイルの抜粋です。

//graphdefinitions.hpp
#include "lane.hpp"
#include "tie.hpp"

typedef boost::adjacency_list<boost::listS, boost::listS, 
                              boost::directedS, Tie, Lane> Map;
typedef boost::graph_traits<Map>::edge_descriptor edge_descriptor;

//lane.hpp
#include "graphdefinitions.hpp"
class Lane {
    ...
    edge_descriptor *left, *right;
};

//tie.hpp
//no important includes here
class Tie {
    ...
};

この依存関係/包含順序の問題を解決するにはどうすればよいですか?

別の編集: edge_descriptor の型は int のようなプリミティブ型である可能性があるという考えがありました。Lane の edge_descriptors を単純な int 変数に置き換えることができ、tie.hpp 内の graphdefinitions.hpp のインクルードを削除できたので、これで問題は解決したはずです。残念ながら、私の考えはひどいものでした。別の解決策を見つけなければなりません。Edge_descriptor タイプは理由があるようです...

4

4 に答える 4

7

BGL には十分に文書化されていない traits クラスがありadjacency_list、プロパティの型を知る必要なく、グラフの頂点と辺の記述子の型を提供します。お客様のユースケースに合わせて設計されています。http://www.boost.org/doc/libs/1_45_0/libs/graph/doc/adjacency_list.htmlの「Associated Types」セクションを見て、vertex_descriptorとの2 つの定義があることに注意してくださいedge_descriptoradjacency_list_traits循環定義を発生させずに、プロパティ バンドルの定義にあるバージョンを使用できます。

于 2011-01-21T06:03:04.650 に答える
0

@DeadMG: PIMPL のようなアプローチを使用しましたが、これで問題が解決したと思います。

それで、私は何をしましたか?Lane-class を次のように変更しました。

//lane.hpp
#include "graphdefinitions.hpp"

class LaneSide;
class Lane {
public:
    const LaneSide getLeft() const;
    const LaneSide getRight() const;
    ...
private:
    LaneSide *left;
    LaneSide *right;
    ...
};

そして、実際には単なる間接的なものであり、lane.hpp 内で前方宣言できなかった型の値を保持する LaneSide クラスは、次のようになります。

//laneside.hpp
class LaneSide
{
    edge_descriptor* edge;
};

これは、意図したとおりにコンパイラをだますようです。ヒントDeadMGをありがとう。私が疑問に思っていたこと: LaneSide オブジェクトを、ポインターとしてではなく実際のオブジェクトとして、Lane クラス内に格納することもできますか? 最初にこれを試しましたが、コンパイラは構造について不平を言いました。また、追加のメモリ消費を回避する方法があるかどうかも疑問に思っています。私のグラフが十分に大きくなると、これは最終的に関連するようになるかもしれません。

于 2010-11-20T20:07:51.050 に答える
0

循環的にヘッダーを含めました。レーンには、グラフ定義などを含むレーンを含むグラフ定義が含まれています。これが問題の原因です。

編集:これはすでにOPで言及されていることに気付きました。この問題を解決するのが PIMPL です。

編集:私が実際に行うことは、typedef を Lane クラス内に配置することです。それは最もきちんとした方法で問題を解決するはずです。

于 2010-11-20T18:05:10.380 に答える
0

このコードについて特別なことは何も必要ないと思います。グラフで使用される型の定義が (前方宣言だけでなく) 宣言されていることを確認する必要があります。

于 2010-11-20T11:50:39.380 に答える