web-dev-qa-db-ja.com

非静的constメンバー、デフォルトの代入演算子は使用できません

私が拡張しているプログラムは、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オブジェクトへのポインタです。

44
Ed James

あなたはこのようなケースがあります:

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実装の例を示したところ、これにつながる可能性があります。

14
user288157

私が知る限り、どこかにあなたは次のようなものを持っています:

// for ease of reading 
typedef std::pair<const Ptr<double, double>, const double*> MyPair;

MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;

MyPairのメンバーはconstであるため、それらを割り当てることはできません。

1
James Curran