2


1

エラーC2679:バイナリ '=':タイプ 'std :: vector <_Ty> *'の右側のオペランドを取る演算子が見つかりません(または、受け入れ可能な変換はありません)

グラフを作成するときに次のことを行います。

#include
using namespace std;

template
class Node
{
private:
  T data;
  Node *link;
  vector  neighbors;
public:
  Node(){neighbors = new vector();};
};

int main()
{
  Node n;
  return 0;
}
  1. エラーC2679を返します:バイナリ '=':演算子が見つかりません…​

VS2010を使用しています。 どうしましたか? ありがとうございます。

2 Answer


8


new`演算子は_pointer_型を返しますが、メンバー変数 neighbors`はポインターではありません。 したがって、ポインター( new`の結果)を非ポインター型に割り当てます。 `neighbors`変数はポインターである必要があります: vector * neighbors`。

しかし、おそらくここで「新しい」の使用を誤解していると思います。 おそらくベクトルポインターさえ使用すべきではありません。 「neighbors = new vector()」という行を削除するだけです。 ベクターオブジェクトは自動的に初期化され、使用できる状態になります。

C ++では、「new」キーワードはヒープ上のオブジェクトを割り当てて初期化し、後で「delete」を使用して解放する必要があります。 次のように、オブジェクトを自動変数として初期化するだけで、「new」キーワードを回避することが望ましいです。

「ベクトルの隣人」

このように、メモリ管理について心配する必要はありません。また、ベクトルオブジェクトはスコープ外になると自動的に破棄されます。


1


vector  neighbors;
neighbors = new vector();

隣人はポインターではありません。

ベクトルを使用する全体のポイントは、メモリを明示的に管理することではありません。 実際、ノードコンストラクターでは、ネイバーはデフォルトで初期化されるため、初期化しないでください。 コンストラクタは次のようになります。

Node(){}

だから、あなたはそれを単に省略することができます:)