Почему компилятор C++ (gcc) думает, что функция является 'виртуальным' полем?

Используя стандартную библиотеку 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))
11
задан e.tadeu 15 March 2010 в 15:45
поделиться

1 ответ

Я получаю эту ошибку, когда первый параметр не имеет для нее смысла. Убедитесь, что 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)
31
ответ дан 3 December 2019 в 02:41
поделиться
Другие вопросы по тегам:

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