C++ Visual Studio 2015 《非标准语法;使用'&'创建指向成员的指针”
C++ Visual Studio 2015 “non-standard syntax; use '&' to create a pointer to member”
我使用 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
// ...
}
我收到以下错误:
Error C3867 'ITaskSettings::get_StopIfGoingOnBatteries': non-standard
syntax; use '&' to create a pointer to member
我的错误是什么以及如何改正?
指向 成员 函数的指针的正确定义是:
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);
}
我猜测 get_StopIfGoingOnBatteries
是 ITaskSettings
的成员函数。当预期参数类型为 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);
}
这不是一个真正的答案,所写的问题不承认答案,但这太长太详细,无法评论。
你没有给出完整的例子,所以必须猜测。
从报错信息可以看出,settings
是一个指向class类型对象的指针,其中class有一个成员函数get_StopIfGoingOnBatteries
.
显然,从 ->
运算符的使用来看,它是一个非 static
成员函数。如果它是 static
,您仍然可以使用 ->
,但那样会不自然。所以假设它是一个非 static
成员函数。
那么你就不能轻易地形成一个指向调用该成员函数的函数的原始指针,因为你需要一个 this
指针来调用。它可以只使用一个虚拟对象,如果创建这样的对象很便宜,或者它可以使用一个全局实例或指向实例的指针。但最好在你的设计中改变一些东西,and/or更清楚地解释你想要什么。
我使用 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
// ...
}
我收到以下错误:
Error C3867 'ITaskSettings::get_StopIfGoingOnBatteries': non-standard syntax; use '&' to create a pointer to member
我的错误是什么以及如何改正?
指向 成员 函数的指针的正确定义是:
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);
}
我猜测 get_StopIfGoingOnBatteries
是 ITaskSettings
的成员函数。当预期参数类型为 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);
}
这不是一个真正的答案,所写的问题不承认答案,但这太长太详细,无法评论。
你没有给出完整的例子,所以必须猜测。
从报错信息可以看出,settings
是一个指向class类型对象的指针,其中class有一个成员函数get_StopIfGoingOnBatteries
.
显然,从 ->
运算符的使用来看,它是一个非 static
成员函数。如果它是 static
,您仍然可以使用 ->
,但那样会不自然。所以假设它是一个非 static
成员函数。
那么你就不能轻易地形成一个指向调用该成员函数的函数的原始指针,因为你需要一个 this
指针来调用。它可以只使用一个虚拟对象,如果创建这样的对象很便宜,或者它可以使用一个全局实例或指向实例的指针。但最好在你的设计中改变一些东西,and/or更清楚地解释你想要什么。