【问题标题】:function pointer typedef - expression must be a modifiable lvalue error函数指针 typedef - 表达式必须是可修改的左值错误
【发布时间】:2016-08-16 20:08:32
【问题描述】:

我有一个函数指针的 typedef,我正在尝试创建一个函数指针并让它指向同一个类的成员函数:

typedef void(Controls::*KeyFunction)(void);

class Controls
{
public:
    void OnKeyDown(Key key);

    // Key Down Functions
    void KeyLeftDown();
    void KeyRightDown();
    void KeyDownDown();
    void KeyUpDown();
private:
    static BOOL KeyEvent(LPARAM keyFunc, WPARAM null, UINT flags);
};

void Controls::OnKeyDown(Key key)
{
    KeyFunction kFunc;
    switch (key)
    {
    case Key::Left:
        kFunc = KeyLeftDown;
        break;
    case Key::Right:
        kFunc = KeyRightDown;
        break;
    case Key::Up:
        kFunc = KeyUpDown;
        break;
    case Key::Down:
        kFunc = KeyDownDown;
        break;
    default:
        return;
    }
    SendKeyEvent(kFunc, DO_NOT_REMOVE);
}

BOOL Controls::KeyEvent(LPARAM keyFunc, WPARAM null, UINT flags)
{
    KeyFunction func = (KeyFunction)(keyFunc);
    func();
    return TRUE;
}

使用 typedef 'KeyFunction' 总是给出错误的表达式必须是可修改的左值。但是,如果我只是使用定义本身并跳过 typedef 它可以工作.. 例如:

void(Controls::*kFunc)(void);
        switch (key)
        {
        case Key::Left:
            kFunc = KeyLeftDown;
            break;
        }

完全有效??? 我做错了什么?

谢谢

【问题讨论】:

    标签: c++ function-pointers typedef member-function-pointers


    【解决方案1】:

    您需要使用正确的语法来获取指向成员函数的指针:

    kFunc = &Controls::KeyLeftDown;
    

    【讨论】:

    • 您好,谢谢您的回答!事实证明这是我在 .h 文件中犯的一个非常愚蠢的错误,我将 typedef 放在类声明之前并且没有注意到。做一个前向声明解决了这个问题,但你的回答帮助我弄清楚了这一点,并且对我提出的问题是正确的。
    【解决方案2】:

    除了@Oktalist 的回答之外,在尝试创建代码的可编译版本后,您的代码还有两个主要问题:

    1. 要获取成员函数指针,语法为&<ClassName>::<FunctionName>

    prog.cpp:31:15:错误:无法将“Controls::KeyLeftDown”从“void (Controls::)()”类型转换为“KeyFunction {aka void (Controls::*)()}”类型

        kFunc = KeyLeftDown;
    

    prog.cpp:31:18: 错误:ISO C++ 禁止使用不合格或带括号的非静态成员函数的地址来形成指向成员函数的指针。说 '&Controls::KeyLeftDown' [-fpermissive]

        kFunc = &KeyLeftDown;
    
    1. 要调用这样的函数,你需要将它绑定到一个对象:(this->*func)()

    prog.cpp:51:10: error: must use '.' or '->' to call pointer-to-member function in 'func (...)', e.g. '(... ->* func) (...)'

    func();
        ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2015-03-30
      相关资源
      最近更新 更多