класс наследования защищенного доступа - PullRequest
0 голосов
/ 15 декабря 2018

Я играю с тестовым классом, который я создал.Код связан ниже.

template<bool...rest_of_string>
class bitstring
{
public:
    void print_this_handler()
    {
        cout << " END";
    }
};

template<bool A, bool... rest_of_string>
class bitstring<A, rest_of_string...> : public bitstring<rest_of_string...>
{
public:
    static const bool value = A;

    bitstring(){}

    void print_this()
    {
        cout << "\nPrinting Bitstring with " << sizeof...(rest_of_string) << " bits: ";
        print_this_handler();
    }
protected:

    void print_this_handler()
    {
        cout << A;
        static_cast<bitstring<rest_of_string...> >(*this).print_this_handler();
    }
};

int main()
{
    bitstring<0,1,0,1,0,1,1,0> str;
    str.print_this();
}

Я сталкиваюсь с ошибкой, когда вызываю print_this_handler () изнутри print_this ().Это говорит о том, что print_this_handler () защищен в классе bitstring.Однако каждый класс происходит от цепочки битов, так почему я не могу получить доступ к следующему по величине классу?Когда я меняю защищенный на общедоступный, все работает нормально, но мне просто любопытно, почему это не работает.Спасибо.

Точное сообщение об ошибке скопировано ниже:

C:\Users\main.cpp|195|error: 'void bitstring<A, rest_of_string ...>::print_this_handler() [with bool A = true; bool ...rest_of_string = {false, true, false, true, true, false}]' is protected within this context|

1 Ответ

0 голосов
/ 15 декабря 2018

Вы пытаетесь вызвать базовый класс print_this_handler, поэтому вам просто нужно указать базовый класс и вызвать его напрямую, попытка сделать это с помощью приведенного указателя дает вам эту проблему.Если вы думаете об этом таким образом, когда вы приводите указатель this к базовому классу, это выглядит так, как если бы вы создали экземпляр базового класса, а затем попытались вызвать защищенную функцию-член.Вы не можете этого сделать, но если вы просто добавите устранение неоднозначности, чтобы указать функцию базового класса, проблем не будет, и вы сможете вызвать ее напрямую.Вы можете взглянуть на этот SO вопрос / ответ для более подробного разъяснения и объяснения: https://stackoverflow.com/a/357380/416574

Измените эту строку:

static_cast<bitstring<rest_of_string...> >(*this).print_this_handler();

На это:

bitstring<rest_of_string...>::print_this_handler();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...