0

私はこのコードを持っています:

using namespace std;
struct nodeT;
struct arcT;


class Graph
{
public:

Graph(string xd);

    void addnode(string name,float xval,float yval);
    void addarc(string n1,string n2,float dist);
    void printarcs();
private:
    struct graphT
    {
        vector<nodeT *>nodes;
        vector<arcT * > arcs;
        map<string,nodeT * > nodemap;
    };
    struct nodeT{
        string nodename;
        float x,y;
        vector<arcT * > arcs;
    };
    struct arcT{
        nodeT * start;
        nodeT * finish;
        float distance;
    };
    void arcfinal(nodeT * a,nodeT * b, float len);
    graphT * g;
    //graphT *g=new graphT;
};

//#include "BST.cpp"

#endif



#include "Graph.h"


Graph::Graph(string xd)
{
g=new graphT;

}

void Graph::addnode(string name,float xval,float yval)
{
    //if(!nodemap[name])

    nodeT *t=new nodeT;
    t->nodename=name;
    t->x=xval;
    t->y=yval;


    g->nodes.push_back(t);
    g->nodemap[name]=t;

}

void Graph::addarc(string n1,string n2,float dist)
{
    nodeT * t1=g->nodemap[n1];
    nodeT * t2=g->nodemap[n2];

    arcfinal(t1,t2,dist);
    arcfinal(t2,t1,dist);

}

void Graph::arcfinal(nodeT * a,nodeT * b, float len)
{
    arcT * d=new arcT;
    d->start=a;
    d->finish=b;
    d->distance=len;

    g->arcs.push_back(d);
    a->arcs.push_back(d);
}

void Graph::printarcs()
{  
    for(arcT * curr=g->arcs.begin();curr != g->arcs.end();++curr)
    {
        cout<<curr->start->nodename<<"-----"<<curr->finish->nodename<<"----"<<curr->distance<<endl;
    }
}

//#endif

そして、私はこのエラーが発生しています:

projects\graphsearch\graphsearch\graph.cpp(21): エラー C2664: 'std::vector<_Ty>::push_back': パラメーター 1 を 'Graph::nodeT *' から 'nodeT *const &' に変換できません.. ..

誰でもデバッグできますか?

4

1 に答える 1

1

少なくとも 3 つのエラーがあります。

1 つ目は、structs をネストできることと、 および のグローバル宣言があることnodeTですarcT。それらはグローバル名前空間にあるため、 のベクトルを作成しています::nodeT*が、実際の構造体はGraph::nodeT*.

宣言を上から構造体の下に移動しprivate:ます。それがそれらを前方宣言する適切な方法です。

2 つ目は、が返される場合と返されないbegin 場合がarcT*あるため、 を使用する必要がありますauto

3 つ目はbegin、イテレータを要素に返すため、ポインタを取得するために逆参照し、メンバーを取得するために再度逆参照する必要があります。

cout << (*curr)->start->nodename << "-----" << (*curr)->finish->nodename << "----" << (*curr)->distance << endl;
于 2013-01-18T06:29:37.043 に答える