0

有向グラフを作成しようとしているので、Graph クラスを作成しました。これには、プライベート エッジ構造体とプライベート ノード構造体があります。エッジには、エッジが指すノードであるノード メンバーが必要です。ノードには、それらから離れたすべてのエッジのリストが必要です。

#ifndef DIRECTED_GRAPH_H 
#define DIRECTED_GRAPH_H

#include <iostream>
#include <vector>
#include <string>

class Graph {
public:
    Graph( const std::string & );
    ~Graph();

    void print();

private:
    struct GNode
    {
        std::string currency_type;
        std::vector<GEdge> edges; // line 19

        GNode( std::string name ) : currency_type( name ) {}
    };

    struct GEdge
    {
        int weight;
        GNode * node; // node that the edge is pointed towards

        GEdge( int weight, GNode* node ) : weight( weight ), node( node ) {}
    };

    GNode *source;
    std::vector<GNode> nodes; 

    void add_node( const std::string & currency );
    void add_edge( const GNode *& source, const GNode *& destination, int weight );
    std::string bellman_ford( const GNode *&source );
};

#include "directed_graph.cpp"

#endif

問題は、宣言されている最初の構造体、この場合GNode、存在することを認識していないGEdgeため、コンパイラーにエラーが発生することです。

directed_graph.h:19: error: ISO C++ forbids declaration of ‘vector’ with no type

どうすればこれを回避できますか?

4

2 に答える 2

4

前方宣言を使用するだけです:

class Graph {

    // ...

private:

    struct GEdge;
//  ^^^^^^^^^^^^^
//  Forward declaration for GEdge

    struct GNode
    {
        std::string currency_type;

        std::vector<GEdge> edges; // <== This is now OK because of the
                                  //     forward declaration above

        GNode( std::string name ) : currency_type( name ) {}
    };

    struct GEdge // <== Now comes the definition of GEdge
    {
        int weight;
        GNode * node; // node that the edge is pointed towards

        GEdge( int weight, GNode* node ) 
            : weight( weight ), node( node ) {}
    };

    // ...
};

上記のコードのコンパイルの完全なライブ例を次に示します。

于 2013-05-12T23:59:17.957 に答える