gpt4 book ai didi

类的 C++ vector 推回错误

转载 作者:行者123 更新时间:2023-11-30 02:49:18 25 4
gpt4 key购买 nike

我是 C++ 新手,我使用 G++ 编译器 (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
我尝试实现无向加权图。由两个类 Edges 和 Graph 组成。但是编译器给我这个错误

编译器报错

/usr/include/c++/4.8/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Tp = UNDIR_W_EDGE]': /usr/include/c++/4.8/bits/alloc_traits.h:254:4: required from 'static typename std::enable_ifAlloc>::_construct_helper<_Tp, _Args>::value, void>::type std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Alloc = std::allocator; typename std::enable_ifAlloc>::_construct_helper<_Tp, _Args>::value, void>::type = void]' /usr/include/c++/4.8/bits/alloc_traits.h:393:57: required from 'static decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = UNDIR_W_EDGE; _Args = {const UNDIR_W_EDGE&}; _Alloc = std::allocator; decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) = ]' /usr/include/c++/4.8/bits/stl_vector.h:906:34: required from '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: required from 'void GRAPH::addEdge(const Edge&) [with Edge = UNDIR_W_EDGE]' ../src/main.cpp:32:13: required from here /usr/include/c++/4.8/ext/new_allocator.h:120:4: error: no matching function for call to 'UNDIR_W_EDGE::UNDIR_W_EDGE(const UNDIR_W_EDGE&)' { ::new((void *)__p) _Up(std::forward<Args>(_args)...); }

代码

图形.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);

最佳答案

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

std::vector<UNDIR_W_EDGE> 中需要拷贝构造函数,以及 CompareTo它按值获取参数(出于某种原因)。

确实有这个:

UNDIR_W_EDGE(UNDIR_W_EDGE &);

大概你打算让它成为:

UNDIR_W_EDGE(const UNDIR_W_EDGE&);

关于类的 C++ vector 推回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351933/

25 4 0