Не поддерживается синтаксис 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"));
}};
Использование этой «двойной скобки» инициализации может работать, но только потому, что она
Hashmap
с внешними скобками. Начиная с Java 9, вы можете использовать Map.of
для указания Map
с определенными значениями, без дополнительных дополнительных анонимных классов.
private Map> s = Map.of("New York", new Pair<>("US Dollar", "NYC"));
Вы также можете рассмотреть возможность создания собственного значимого класса для использования вместо класса Pair
общего назначения.
У Вас есть случай как это:
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
, у участника есть квалифицированный тип константы!
Насколько я могу сказать, где-нибудь у Вас есть что-то как:
// for ease of reading
typedef std::pair<const Ptr<double, double>, const double*> MyPair;
MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;
, Так как члены MyPair являются константой, Вы не можете присвоить им.
По крайней мере, упоминание, которые возражают компилятору, жалуется на. По всей вероятности Вы скучаете по пользовательскому участнику присвоения. Если Вы не имеете один, значение по умолчанию, каждый умирает. Вероятно, у Вас также есть участник константы в том классе (чьи объекты присваиваются), и так как участник константы не может быть изменен, Вы поражаете ту ошибку.
Другой подход: Так как это - класс const
, я предлагаю, чтобы Вы изменили его на static const
, если это имеет смысл.