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

至少有三个错误。

第一个是structs 可以嵌套,并且你有 and 的全局nodeT声明arcT。它们位于全局命名空间中,因此您正在制作 的向量::nodeT*,但真正的结构是Graph::nodeT*.

将声明从顶部移动到private:. 这是向前声明它们的正确方法。

第二个是begin 可能不返回一个arcT*,你应该使用auto

第三个是begin返回元素的迭代器,因此您需要取消引用它以获取指针,然后再次取消引用它以获取成员,例如

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