Здравствуйте. У меня есть следующий код а-ля HelloWrold:
#include
class A
{
public :
void eat ()const
{
cout << "inside eat" << endl;
};
};
class B : private A
{
public :
using A::eat;
};
int main()
{
B b(); // {1}
B b; // {2}
b.eat();
return 0;
}
Собственно вопрос: если закомментировать строку {1} и раскомментировать строку {2} то все компилируется. А если наоборот закомментировать строку {2} и раскомментировать строку {1} то выдается сообщение об ошибке "request for member 'eat' in 'b', which is of non-class type 'B ()()"
В чем же причина такого поведения компилятора? Заранее спасибо
Ответ
Потому, что B b(); это не определение переменной, а определение функции b без аргументов, которая возвращает B. Проверить это легко - добавьте в класс B конструктор по умолчанию, который выводит в лог/консоль.
#include
using namespace std;
class B
{
public :
B() {
cout << "bbb" << endl;
}
};
int main()
{
B b();
return 0;
}
В логе будет пустота.
Детали можно почитать в стандарте в пунктах 6.8 и 8.2
Комментариев нет:
Отправить комментарий