2016-09-21 55 views
0

我的TaskScheduler COM工作,这是我的代码:C++ Visual Studio 2015“非标准语法;使用“&”来创建一个指针成员”

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 
    // ... 
} 

,我得到以下错误:

Error C3867 'ITaskSettings::get_StopIfGoingOnBatteries': non-standard syntax; use '&' to create a pointer to member

什么是我的错误,如何纠正它?

+1

@PeteBecker该函数的参数('GetBool')是一个采用bool的函数,它不能与成员函数一起使用。 – Borgleader

+0

你不能那样做。非静态类成员函数不是函数,例如它们不能被称为*,就像可以调用的函数一样。 –

+0

投票结束为**不清楚你问**的内容。请参阅[我的评论 - 答案](http://stackoverflow.com/a/39622968/464581)一些希望对此有帮助的评论。 –

回答

1

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

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); 
} 
+0

即使你改变了,你也不能在没有实例的情况下调用成员函数。 – Borgleader

+0

@Borgleader:没错;答案固定(我希望没有错) – shrike

+0

@shrike我在这行看到错误'expected a member name':'setting - >(* func)(&b);' – codeDom

2

我猜测get_StopIfGoingOnBatteriesITaskSettings成员函数。当预期的参数类型为FuncOfBoll时,不能使用这样的函数。你需要创建一个包装函数并使用它。

ITaskSettings* currentSetttings = NULL; 

HRESULT GetBoolWrapper(_Out_ VARIANT_BOOL* b) 
{ 
    return currentSetttings->get_StopIfGoingOnBatteries(b); 
} 

void test(ITaskSettings* settings) 
{ 
    currentSetttings = settings; 
    bool b = GetBool(GetBoolWrapper); 
} 
0

这是不是一个真正的答案,问题是写不承认的答案,但这是太长&详细的评论。

你不显示完整的例子,所以必须有猜测

显然,根据错误消息判断,settings是一个指向类类型对象的指针,其中该类具有成员函数get_StopIfGoingOnBatteries

显然,通过使用->运营商来判断,它是一个非static成员函数。如果它是static,您仍然可以使用->,但那会不自然。所以我们假设这是一个非static成员函数。

然后,您不能轻松地形成一个原始指针,以调用该成员函数的函数,因为您需要一个this指针 - 指针。它可以使用虚拟对象,如果创建这样的对象很便宜,或者它可以使用全局实例或指向实例的指针。但是,更好地改变设计中的某些内容,并且/或者更清楚地解释你想要的内容。

相关问题