class A{
public:
A(int a = -1){}
void f(){}
};
тут все просто и очевидно.A a();
a.f();
ssd1306_128x32_i2c_test.ino:50:3: error: request for member 'f' in 'a', which is of non-class type 'A()'
A a;
a.f();
Вы не допускайте, а возьмите онлайн IDE с C++17 и вуаля.
main.cpp: In function 'int main()':
main.cpp:11:7: error: request for member 'f' in 'a', which is of non-class type 'A()'
a.f();
^
typeid(a).name() == A ()
A ()clang++ prog.cc -Wall -Wextra -std=gnu++2a -pedantic
warning: empty parentheses interpreted as a function declaration
note: remove parentheses to declare a variable
error: base of member reference is a function; perhaps
you meant to call it with no arguments?
Казалось бы, в обоих случаях у нас вызов конструктора,
A a();
-- это объявление функции a, без параметров, возвращающей значение типа A.
И получаем странную ошибку при компиляции:
ssd1306_128x32_i2c_test.ino:50:3: error: request for member 'f' in 'a', which is of non-class type 'A()'
А вот и нет. A a(); -- это объявление функции a, без параметров, возвращающей значение типа A.
SomeType var_name(); //я же просто хотел дефолтный деструктор вызвать, а не функцию объявлять.
Это болезнь языка Си++ и ее надо вылечить.
ssd1306_128x32_i2c_test.ino:50:3: error: request for member 'f' in 'a', which is of non-class type 'A()'
я ему говорю: создай мне объект типа "х", а он мне "ОК" - не вопрос, только я создам прототип функции, а тебе об этом не скажу.
Только косвенный признак "не класс" - это к слову о том как порой не совсем точные формулировки могут вводить в ступор
6.8 ambiguity resolution [stmt.ambig] и 8.2 ambiguity resolution [dcl.ambig.res])вот, вот я именно об этом моменте и писал выше, что он должен был написать что-то типа: "извини повелитель, я в замешательстве, это функция, и я ее объявил как функцию"
Компиляторы тоже пишутся людьми, улучшения в качестве диагностики имеют хорошие шансы на то, чтобы быть принятыми в компилятор.понял ваш намек, но мне бы до землян достучаться, на родной кириллице, а пример есть вон самом начале, по сути готовый юниттест.
$ cat test.cpp
class A {
public:
A()
{
}
void bar()
{
}
};
void baz()
{
A foo();
foo.bar();
}
$ g++ -c test.cpp
test.cpp: In function ‘void baz()’:
test.cpp:16:6: error: request for member ‘bar’ in ‘foo’, which is of functional type ‘A()’
16 | foo.bar();
| ^~~
test.cpp:14:4: note: ‘A foo()’ is a function declaration, not a default-constructed object
14 | A foo();
| ^~~
я не могу понять почему компилятор ЕДИНОЛИЧНО принял решение именно о том что это объявление прототипа функции, а не объявление переменной с вызовом конструктора по умолчанию?!
Вообще я не знаю как по стандарту, но я что-то не припомню...
[C++ Error] test.cpp(line xx ): E2015 Ambiguity between function declaration 'A a();' and declaration instance object of class A