Страницы

Поиск по вопросам

четверг, 20 декабря 2018 г.

Закрытое наследование: request for member 'eat' in 'b', which is of non-class type

Здравствуйте. У меня есть следующий код а-ля HelloWrold: #include using namespace std;
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

Комментариев нет:

Отправить комментарий