指向虚函数中成员函数的指针
Pointer to member function in virtual function
是否可以从覆盖的虚函数中调用成员函数?编译器告诉我成员函数没有地址(lvalue required as unary '&' operand)。我想做类似的事情:
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)
等),因为它不认为它是左值(即,它没有地址)。我认为原因是虚函数是在 运行 时求值的,而这个成员指针必须在编译时求值。那么,还有什么办法吗?
谢谢!
错误消息已经很好地提示了这里的错误:
<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 () !!!
是否可以从覆盖的虚函数中调用成员函数?编译器告诉我成员函数没有地址(lvalue required as unary '&' operand)。我想做类似的事情:
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)
等),因为它不认为它是左值(即,它没有地址)。我认为原因是虚函数是在 运行 时求值的,而这个成员指针必须在编译时求值。那么,还有什么办法吗?
谢谢!
错误消息已经很好地提示了这里的错误:
<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 () !!!