我正在玩我创建的测试课程。代码链接在下面。
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()内部调用print_this_handler()时遇到错误。它说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|
答案 0 :(得分:2)
您正试图调用基类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();