Нестатический член const не может использовать оператор присваивания по умолчанию
Программа, которую я расширяю, использует std::pair<>
много.
В моем коде есть точка, в которой компилятор бросает довольно большой:
Нестатический член const, 'const Ptr std:: pair, const double * > :: first' не может использовать оператор присваивания по умолчанию
Я не совсем уверен, что это значит?
Какие методы отсутствуют в классе Ptr?
Первоначальный вызов, вызывающий эту проблему, выглядит следующим образом:
vector_of_connections.pushback(pair(Ptr<double,double>,WeightValue*));
Где он помещает std::Pair<Ptr<double,double>, WeightValue*>
в вектор, где WeightValue*
является константной переменной из примерно трех функций назад, а Ptr<double,double>
берется из итератора, который работает над другим вектором.
Для справки в будущем Ptr<double,double>
является указателем на объект Node
.
Ответы
Ответ 1
У вас есть такой случай:
struct sample {
int const a; // const!
sample(int a):a(a) { }
};
Теперь вы используете это в каком-то контексте, который требует назначения sample
- возможно в контейнере (например, в виде карты, вектора или чего-то еще). Это не сработает, потому что неявно определенный оператор назначения копирования выполняет что-то по этой линии:
// pseudo code, for illustration
a = other.a;
Но a
является const!. Вы должны сделать это неконстантным. Это не повредит, потому что, пока вы его не меняете, он по-прежнему логически const:). Вы могли бы исправить эту проблему, введя подходящий operator=
, чтобы компилятор не определял одно неявно. Но это плохо, потому что вы не сможете изменить свой член-член. Таким образом, имея оператор =, но все же не присваиваемый! (потому что копия и назначенное значение не идентичны!):
struct sample {
int const a; // const!
sample(int a):a(a) { }
// bad!
sample & operator=(sample const&) { }
};
Однако в вашем случае очевидная проблема, по-видимому, находится в пределах std::pair<A, B>
. Помните, что a std::map
сортируется по содержащимся в нем ключам. Из-за этого вы не можете изменять свои ключи, потому что это может легко отобразить состояние карты неверно. Из-за этого выполняется следующее:
typedef std::map<A, B> map;
map::value_type <=> std::pair<A const, B>
То есть, он запрещает изменять свои ключи, которые он содержит! Так что если вы делаете
*mymap.begin() = make_pair(anotherKey, anotherValue);
Карта выдает вам ошибку, потому что в паре некоторого значения, хранящегося на карте, член ::first
имеет тип со знаком const!
Ответ 2
Я столкнулся с той же проблемой и наткнулся на эту страницу.
http://blog.copton.net/archives/2007/10/13/stdvector/index.html
На странице:
Обратите внимание, что здесь нет конкретной проблемы с GNU. Стандарт ISO С++ требует, чтобы T имел оператор присваивания (см. Раздел 23.2.4.3). Я просто показал на примере реализации GNU STL, где это может привести.
Ответ 3
Насколько я могу судить, в каком-то месте у вас есть что-то вроде:
// for ease of reading
typedef std::pair<const Ptr<double, double>, const double*> MyPair;
MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;
Поскольку члены MyPair являются const, вы не можете назначать им.
Ответ 4
По крайней мере упомяните о том, на ком компилятор жалуется. Скорее всего, у вас отсутствует пользовательский член назначения. Если у вас его нет, по умолчанию используется один из них. Вероятно, у вас также есть член const в этом классе (объекты которого назначаются), и поскольку член const не может быть изменен, вы попадаете в эту ошибку.
Другой подход: поскольку это класс const
, я предлагаю вам изменить его на static const
, если это имеет смысл.