Нестатический участник константы, не может использовать оператор присваивания по умолчанию

Не поддерживается синтаксис Java для создания конструкции Java в Java, такой как литерал карты. Если вы поместите "US Dollar", "NYC" в круглые скобки, как вы сделали, тогда компилятор предположит, что есть какое-то выражение. Он находит запятую и жалуется, что нет оператора присваивания. В действительности возможны другие операторы, такие как +, но это сообщение, которое дает компилятор. Синтаксический анализатор просто опустил возможность «выражения присваивания» в дереве разбора, пытаясь понять, что оказалось синтаксической ошибкой.

Предполагая, что вы уже создали свой собственный класс Pair, который уже находится в области видимости, просто создайте Pair явно с помощью new. (Вы можете использовать оператор diamond, доступный с Java 7, чтобы сократить ваш код.)

private HashMap> s = new HashMap<>() {{
    put("New York", new Pair<>("US Dollar", "NYC"));
}};

Использование этой «двойной скобки» инициализации может работать, но только потому, что она

    [ 1112] Создает анонимный подкласс Hashmap с внешними скобками.
  1. Создает инициализатор экземпляра с внутренними скобками, который используется для инициализации карты.

Начиная с Java 9, вы можете использовать Map.of для указания Map с определенными значениями, без дополнительных дополнительных анонимных классов.

private Map> s = Map.of("New York", new Pair<>("US Dollar", "NYC"));

Вы также можете рассмотреть возможность создания собственного значимого класса для использования вместо класса Pair общего назначения.

44
задан Vadim Kotov 11 August 2018 в 14:58
поделиться

3 ответа

У Вас есть случай как это:

struct sample {
    int const a; // const!

    sample(int a):a(a) { }
};

Теперь, Вы используете это в некотором контексте, который требует sample быть присваиваемым - возможный в контейнере (как карта, вектор или что-то еще). Это перестанет работать, потому что неявно определенный оператор присваивания копии делает что-то вдоль этой строки:

// pseudo code, for illustration
a = other.a;

, Но a константа!. Необходимо сделать это неконстантой. Это не причиняет боль, потому что, пока Вы не изменяете его, это - все еще логически константа:) Вы могли решить проблему путем представления подходящего 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, у участника есть квалифицированный тип константы!

77
ответ дан Drew Noakes 26 November 2019 в 22:00
поделиться

Насколько я могу сказать, где-нибудь у Вас есть что-то как:

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

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

, Так как члены MyPair являются константой, Вы не можете присвоить им.

1
ответ дан James Curran 26 November 2019 в 22:00
поделиться

По крайней мере, упоминание, которые возражают компилятору, жалуется на. По всей вероятности Вы скучаете по пользовательскому участнику присвоения. Если Вы не имеете один, значение по умолчанию, каждый умирает. Вероятно, у Вас также есть участник константы в том классе (чьи объекты присваиваются), и так как участник константы не может быть изменен, Вы поражаете ту ошибку.

Другой подход: Так как это - класс const, я предлагаю, чтобы Вы изменили его на static const, если это имеет смысл.

-1
ответ дан dirkgently 26 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: