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

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 () защищен в битовой строке класса. Однако каждый класс является производным от цепочки битов, так почему я не могу получить доступ к следующему наивысшему классу? Когда я меняю protected на public, все работает нормально, но мне просто любопытно, почему это не работает. Спасибо.

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

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|
2
Saswat Mishra 15 Дек 2018 в 10:30

1 ответ

Лучший ответ

Вы пытаетесь вызвать базовый класс 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();
2
pstrjds 15 Дек 2018 в 07:55