【问题标题】:Graph .h file and .cpp file im getting many errors图形 .h 文件和 .cpp 文件我遇到很多错误
【发布时间】:2013-01-18 06:00:50
【问题描述】:

我有这个代码:

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 & '....

谁能调试一下?

【问题讨论】:

  • 如果代码无法编译,则无法调试。
  • 它确实编译了....我得到了标题中提到的错误
  • 那是编译器错误,所以我看不到代码是如何编译的。
  • 你建议...我坚持了很长时间
  • 去掉顶部nodeT和arcT的前向声明是否有效?

标签: c++ graph


【解决方案1】:

至少有三个错误。

首先是structs可以嵌套,你有nodeTarcT的全局声明。它们位于全局命名空间中,因此您正在制作::nodeT* 的向量,但真正的结构是Graph::nodeT*

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

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

第三个是begin给元素返回了一个迭代器,所以需要解引用才能得到指针,然后再解引用才能得到成员,比如

cout << (*curr)->start->nodename << "-----" << (*curr)->finish->nodename << "----" << (*curr)->distance << endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多