C ++类向量推回错误

时间:2014-01-25 14:42:17

标签: c++ templates c++11 vector stl

我是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)...); }

守则

GRAPH.h文件

#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;
};

UNDIRWEDGE.h文件

 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);

1 个答案:

答案 0 :(得分:3)

您没有UNDIR_W_EDGE的复制构造函数。

std::vector<UNDIR_W_EDGE>内部以及CompareTo中需要复制构造函数,后者按值(由于某种原因)获取其参数。

有这个:

UNDIR_W_EDGE(UNDIR_W_EDGE &);

据推测,你打算这样做:

UNDIR_W_EDGE(const UNDIR_W_EDGE&);