3

我对 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;
};
4

3 回答 3

3

映射中的元素按照构造时设置的特定严格弱排序标准从低到高的键值排序。

您需要为 Vertex 提供 operator<,例如:

bool operator<(const Vertex& lhs, const Vertex& rhs){
      return lhs.node < rhs.node;
  }

Vertex myVertex = *new Vertex(1);正如 David 和 selbie 所提到的那样,还会泄漏内存。看看这个链接:为什么使用'new'会导致内存泄漏?

更改Vertex myVertex = *new Vertex(1);Vertex myVertex = Vertex(1);

于 2012-12-16T03:10:38.690 回答
1

我有同样的问题,最后,我只是在 Build Settings 中将 Xcode 默认 C++ 库更改为 libstdc++(GNU C++ 标准库)。它已经解决了。

就像下图一样。 在此处输入图像描述

于 2015-03-26T03:37:13.893 回答
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;
};
于 2012-12-16T03:23:36.540 回答