Подтвердить что ты не робот

Нестатический член 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.

4b9b3361

Ответ 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, если это имеет смысл.