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);デビッドとセルビーが述べたように、メモリもリークします。このリンクを見てください: 「new」を使用するとメモリ リークが発生するのはなぜですか?

Vertex myVertex = *new Vertex(1);に変更Vertex myVertex = Vertex(1);

于 2012-12-16T03:10:38.690 に答える
1

私は同じ問題を抱えています。最後に、ビルド設定で 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 に答える