我是C ++的新手,我使用的是G ++编译器(Ubuntu 4.8.1-2ubuntu1~12.04)4.8.1
我尝试实现无向wieghted Graph。由两个类Edges和Graph组成。但是编译器给了我这个错误
/ usr / include / c ++ / 4.8 / ext / new_allocator.h:实例化'void __gnu_cxx :: new_allocator< _Tp> :: construct(_Up *,_ Args&& ...) [与_Up = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Tp = UNDIR_W_EDGE]“: /usr/include/c++/4.8/bits/alloc_traits.h:254:4:从'static typename中获取 的std :: enable_ifAlloc> :: _ construct_helper< _TP, _Args> :: value,void> :: type std :: allocator_traits< _Alloc> :: _ S_construct(_Alloc&,_Tp *,_ Args&& ......)[与_Tp = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Alloc = 的std ::分配器;类型名 的std :: enable_ifAlloc> :: _ construct_helper< _TP, _Args> :: value,void> :: type = void]' /usr/include/c++/4.8/bits/alloc_traits.h:393:57:从'static decltype(_S_construct(__ a,__ p, (正向< _args&GT)(标准:: allocator_traits ::构造:: __参数)...)) std :: allocator_traits< _Alloc> :: construct(_Alloc&,_Tp *,_ Args&& ...) [与_Tp = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Alloc = 的std ::分配器; decltype(_S_construct(__ a,__ p, (forward< _Args>)(std :: allocator_traits :: construct :: __ args)...))= ]” /usr/include/c++/4.8/bits/stl_vector.h:906:34:需要来自'void std :: vector< _Tp,_Alloc> :: push_back(const value_type&)[with _Tp = UNDIR_W_EDGE; _Alloc = std :: allocator; std :: vector< _Tp,_Alloc> :: value_type = UNDIR_W_EDGE]' ../src/GRAPH.h:31:5:需要'void GRAPH :: addEdge(const Edge&)[with Edge = UNDIR_W_EDGE]' ../src/main.cpp:32:13:从这里要求 /usr/include/c++/4.8/ext/new_allocator.h:120:4:错误:没有匹配函数来调用'UNDIR_W_EDGE :: UNDIR_W_EDGE(const UNDIR_W_EDGE&)' {:: new((void *)__ p)_Up(std :: forward< Args>( _args)...); }
#include "vector"
template <typename Edge>
class GRAPH {
private:
// Implementation-dependent code
int Vcnt;
int Ecnt;
std::vector<std::vector< Edge > > adj;
public:
GRAPH(int x):Vcnt(x),Ecnt(0) {
adj.resize(Vcnt);
}
virtual ~GRAPH();
virtual int V() const;
virtual int E() const;
virtual void addEdge(const Edge &e){
adj[e.V()].push_back(e);
adj[e.W()].push_back(e);
Ecnt++;
};
virtual std::vector< Edge > adjIterator(int) const;
};
class UNDIR_W_EDGE {
int v,w;
float weight;
public:
UNDIR_W_EDGE(int v, int w, float weight);
UNDIR_W_EDGE(UNDIR_W_EDGE &);
virtual ~UNDIR_W_EDGE();
virtual int V()const;
virtual int W()const;
virtual float WEIGHT()const;
virtual int CompareTo(UNDIR_W_EDGE e)const;
};
UNDIRWEDGE.cpp 中的inline int UNDIR_W_EDGE::CompareTo(UNDIR_W_EDGE e)const{
if(this->weight > e.weight) return 1;
else if (this->weight < e.weight)return -1;
else return 0;
}
在main.cpp GRAPH<UNDIR_W_EDGE> g(10);
UNDIR_W_EDGE e(0,7,0.0);
g.addEdge(e);
答案 0 :(得分:3)
您没有UNDIR_W_EDGE
的复制构造函数。
std::vector<UNDIR_W_EDGE>
内部以及CompareTo
中需要复制构造函数,后者按值(由于某种原因)获取其参数。
你做有这个:
UNDIR_W_EDGE(UNDIR_W_EDGE &);
据推测,你打算这样做:
UNDIR_W_EDGE(const UNDIR_W_EDGE&);