是否可以从重写的虚拟函数中调用成员函数?编译器告诉我成员函数没有地址(需要一元'&'操作数的左值)。我想做类似的事情:
class Virtual
{
public:
virtual void f() = 0;
};
class Real : public Virtual
{
public:
void f() override { g(&Real::h()); }
private:
void g(bool (Real::*p)() );
bool h();
};
但是,在f()
中,任何成员指针语句都是无效的(&Real::h()
,std::mem_fn(&Real::h())
,std::function<bool<void>(h)
等),因为它不认为它是l值(即,它没有地址)。我认为原因是虚函数在运行时评估,并且该成员指针必须在编译时评估。然后,还有其他选择吗?
谢谢!
答案 0 :(得分:2)
该错误消息已经很好地提示了这里出了什么问题:
<source>:10:27: error: cannot take the address of an rvalue of type 'bool'
void f() override { g(&Real::h()); }
^~~~~~~~~~
Real::h()
是bool
。指向成员函数的指针的正确语法是
void f() override { g(&Real::h); }
// ^ -------- no () !!!