我使用TaskScheduler COM,这是我的代码:

typedef HRESULT(*FuncOfBoll)(_Out_ VARIANT_BOOL* b);

static bool GetBool(FuncOfBoll func)
{
    VARIANT_BOOL b = VARIANT_FALSE;
    HRESULT hr = func(&b);
    if (FAILED(hr)) return FALSE;
    return b == VARIANT_TRUE;
}

void test(ITaskSettings* settings)
{
    bool b = GetBool(settings->get_StopIfGoingOnBatteries); // <= The error here
    // ...
}


我收到以下错误:


  错误C3867'ITaskSettings :: get_StopIfGoingOnBatteries':非标准
  句法;使用“&”创建指向成员的指针


我的错误是什么以及如何纠正?

最佳答案

指向成员函数的指针的正确定义是:

typedef HRESULT(ITaskSettings::*FuncOfBoll)(_Out_ VARIANT_BOOL* b);


然后,您应该将指向对象实例的指针传递给函数GetBool

static bool GetBool(ITaskSettings* setting, FuncOfBoll func)
{
    VARIANT_BOOL b = VARIANT_FALSE;
    HRESULT hr = (setting->*func)(&b);
    ...
}


或者,使用模板:

template<class C>
static bool GetBool(C* p, HRESULT(C::*func)(_Out_ VARIANT_BOOL*))
{
    VARIANT_BOOL b = VARIANT_FALSE;
    HRESULT hr = (p->*func)(&b);
    ...
}


调用:

void test(ITaskSettings* settings)
{
    currentSetttings = settings;
    bool b = GetBool(settings, &ITaskSettings::mb_function);
}

关于c++ - C++ Visual Studio 2015“非标准语法;使用“&”创建指向成员的指针”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39622640/

10-13 08:34