Страницы

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

вторник, 31 декабря 2019 г.

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

#cpp


Здравствуйте. У меня есть следующий код а-ля 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 ()()" 
В чем же причина такого поведения компилятора? Заранее спасибо    


Ответы

Ответ 1



Потому, что 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

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

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