Используя стандартную библиотеку lib, вы можете сделать это следующим образом:
// convert maps to seq, to keep duplicate keys and concat
val merged = Map(1 -> 2).toSeq ++ Map(1 -> 4).toSeq
// merged: Seq[(Int, Int)] = ArrayBuffer((1,2), (1,4))
// group by key
val grouped = merged.groupBy(_._1)
// grouped: scala.collection.immutable.Map[Int,Seq[(Int, Int)]] = Map(1 -> ArrayBuffer((1,2), (1,4)))
// remove key from value set and convert to list
val cleaned = grouped.mapValues(_.map(_._2).toList)
// cleaned: scala.collection.immutable.Map[Int,List[Int]] = Map(1 -> List(2, 4))
Я получаю эту ошибку, когда первый параметр не имеет для нее смысла. Убедитесь, что Evaluator
известен как тип:
struct A {
virtual void* b(nonsense*, string*);
};
=> error: 'b' declared as a 'virtual' field
struct A {
virtual void* b(string*, nonsense*);
};
=> error: 'nonsense' has not been declared
Чтобы узнать, является ли что-то объявлением объекта или функции, компилятору иногда приходится сканировать все объявление. Любая конструкция в объявлении, которая могла бы образовать объявление, считается объявлением. Если нет, то любая такая конструкция считается выражением. GCC, по-видимому, думает, потому что чушь
не является допустимым типом, это не может быть допустимым объявлением параметра, и, таким образом, возвращается к обработке всего объявления как поля (обратите внимание, что в нем дополнительно говорится об ошибке : ожидается ';' before '(' token
). То же самое в локальной области
int main() {
int a;
// "nonsense * a" not treated as declaration
void f(nonsense*a);
}
=> error: variable or field 'f' declared void
int main() {
// "nonsense * a" treated as parameter declaration
typedef int nonsense;
void f(nonsense*a);
}
=> (compiles successfully)