我仍然是C ++的新手,我无法弄清楚如何修复错误。错误我正在说“二进制表达式的操作数无效”。有没有人知道如何解决这个问题?任何帮助表示赞赏!!我正在使用Xcode 4.5.2。谢谢!
[编辑]好的。我已经更新了以下代码。我仍然在同一行(find())得到相同的错误......但这里是变化......
Vertex myVertex = new Vertex(1);
到
Vertex myVertex(1);
为<
添加了运算符重载struct Vertex {
int node;
bool known;
float distance;
Vertex *path;
Vertex(int n=0, bool known=false, duuble dist=INFINITY):
node(n), known(known), distance(dist) {}
};
struct Edge {
Vertex target;
float weight;
bool directed;
Edge(Vertex v2, float w, bool dir):target(v2), weight(w), directed(dir) {}
};
class Graph {
public:
/*unrelated members are removed*/
void findVertex() {
Vertex myVertex(1);
map<Vertex, vector<Edge> >::iterator itr;
itr = edges.find(myVertex); // <--- this is the line the error seems to related to
}
friend bool operator< (const Vertex& lhs, const Vertex& rhs) {
return lhs.node < rhs.node;
}
private:
/*unrelated members are removed*/
vector<Vertex> vertices;
map<Vertex, vector<Edge> > edges;
};
答案 0 :(得分:3)
在构造中设置的特定严格弱排序标准之后,地图中的元素按从较低到较高的键值排序。
您需要提供运营商&lt;对于Vertex,例如:
bool operator<(const Vertex& lhs, const Vertex& rhs){
return lhs.node < rhs.node;
}
大卫和塞尔比提到,Vertex myVertex = *new Vertex(1);
也泄漏了记忆。请看一下这个链接:Why does the use of 'new' cause memory leaks?
将Vertex myVertex = *new Vertex(1);
更改为Vertex myVertex = Vertex(1);
答案 1 :(得分:0)
我喜欢BillZ的回答。但我永远不会存储重复的数据。在顶点和边缘成员之间存储重复的顶点成员就是这种情况。
考虑这样做,然后你没有在Vertex类中实现比较运算符。我不知道你的findVertex函数会将什么作为输入参数,所以我只是两种方式都写了。
class Graph {
public:
/*unrelated members are removed*/
void findVertex(int nodeNumber) {
map<int, vector<Edge> >::iterator itr;
itr = edges.find(nodeNumber);
}
void findVertex(const Vertex& v) {
map<int, vector<Edge> >::iterator itr;
itr = edges.find(v.node);
}
private:
/*unrelated members are removed*/
vector<Vertex> vertices;
map<int, vector<Edge> > edges;
};
答案 2 :(得分:0)
我遇到了同样的问题,最后,我只是在Build Settings中将Xcode默认的C ++库更改为libstdc ++(GNU C ++标准库)。它已经解决了。
如下图所示。