2013-01-18 65 views
0

我有這樣的代碼:圖h文件和cpp文件即時得到許多錯誤

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) : error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'Graph::nodeT *' to 'nodeT *const &'....

誰能請調試呢?

+0

如果代碼不編譯,你不能調試它。 – leppie

+0

它編譯....即時通訊錯誤提到標題 – beckham556

+0

這是一個編譯器錯誤,所以我看不出代碼如何編譯。 – leppie

回答

1

至少有三個錯誤。

第一個是struct s可以嵌套,並且您有全局聲明nodeTarcT。它們位於全局名稱空間中,因此您正在製作::nodeT*的矢量,但實際結構爲Graph::nodeT*

將聲明從頂部移動到private:下的結構中。這是正確的方式來提前宣佈它們。

第二是begin 可能會或可能不會 不返回arcT*,你應該使用auto

三是begin返回一個迭代的元素,所以你需要取消對它的引用去的指針,則取消對它的引用再次去成員,如

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

真棒工作。謝謝很多塞思卡內基 – beckham556

相關問題