Почему С++ компилятор (gcc) считает, что функция - это виртуальное поле?

У меня есть следующее определение метода в моем классе:

virtual Calc* Compile(
  Evaluator* evaluator, ResolvedFunCall* fun_call, string* error);

По какой-то причине GCC жалуется, что:

error: 'Compile' declared as a 'virtual' field

Любые идеи, по которым он считал бы Компилировать как поле, а не методом?

Ответ 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, по-видимому, думает, потому что nonsense не является допустимым типом, он не может быть допустимым объявлением параметра и, таким образом, отпадает, обрабатывая всю декларацию как поле (обратите внимание, что он говорит дополнительно error: expected ';' 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)