Ответ 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)