Почему компилятор C ++ (gcc) считает, что функция является «виртуальным» полем? - PullRequest
11 голосов
/ 20 мая 2009

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

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

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

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

Есть идеи, почему он считает, что Compile - это поле, а не метод?

1 Ответ

29 голосов
/ 20 мая 2009

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