私が拡張しているプログラムは、std::pair<>
をよく使用しています。
私のコードには、コンパイラーがかなり大きな値をスローするポイントがあります。
非静的constメンバー、 'const Ptr std :: pair、const double *> :: first' ca n't use default assignment operator
これが何を指しているのか本当にわかりませんか? Ptrクラスにないメソッドはどれですか?
この問題を引き起こす元の呼び出しは次のとおりです。
vector_of_connections.pushback(pair(Ptr<double,double>,WeightValue*));
std::Pair<Ptr<double,double>, WeightValue*>
をベクターに配置する場合、WeightValue*
は約3つの関数からのconst変数であり、Ptr<double,double>
は別のベクターに対して機能するイテレーターから取得されます。
将来の参考のために、Ptr<double,double>
はNode
オブジェクトへのポインタです。
あなたはこのようなケースがあります:
struct sample {
int const a; // const!
sample(int a):a(a) { }
};
これで、sample
を割り当て可能にする必要があるコンテキストで使用します-コンテナー(マップ、ベクターなど)で可能です。暗黙的に定義されたコピー割り当て演算子がこの行に沿って何かを行うため、これは失敗します。
// pseudo code, for illustration
a = other.a;
しかし、a
はconst!です。あなたはそれを非定数にする必要があります。あなたがそれを変更しない限り、それは論理的にconstなので、害はありません:)適切なoperator=
を導入してコンパイラーを作成することで問題を修正することもできます notは暗黙的に1つを定義します。しかし、constメンバーを変更することができないため、それは悪いことです。したがって、operator =を指定しても、まだ割り当て可能ではありません! (コピーと割り当てられた値が同一ではないため!):
struct sample {
int const a; // const!
sample(int a):a(a) { }
// bad!
sample & operator=(sample const&) { }
};
ただしあなたの場合、明らかに問題はstd::pair<A, B>
にあります。 std::map
は、それに含まれるキーでソートされることに注意してください。そのため、マップの状態を簡単に無効にすることができるため、キーを変更することはできません。そのため、次のことが当てはまります。
typedef std::map<A, B> map;
map::value_type <=> std::pair<A const, B>
つまり、含まれているキーの変更を禁止します。だからあなたがするなら
*mymap.begin() = make_pair(anotherKey, anotherValue);
マップに格納されているいくつかの値のペアでは、::first
メンバーにconst修飾型があるため、マップはエラーをスローします。
私は同じ問題に直面し、このページに出くわしました。
http://blog.copton.net/archives/2007/10/13/stdvector/index.html
ページから:
これはGNU特定の問題ではないことに注意してください。ISOC++標準では、Tに代入演算子が必要です(セクション23.2.4.3を参照)。GNUのSTL実装の例を示したところ、これにつながる可能性があります。
私が知る限り、どこかにあなたは次のようなものを持っています:
// for ease of reading
typedef std::pair<const Ptr<double, double>, const double*> MyPair;
MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;
MyPairのメンバーはconstであるため、それらを割り当てることはできません。