C++ Visual Studio 2015“非标准语法;使用 '&' 创建指向成员的指针”
Posted
技术标签:
【中文标题】C++ Visual Studio 2015“非标准语法;使用 \'&\' 创建指向成员的指针”【英文标题】:C++ Visual Studio 2015 “non-standard syntax; use '&' to create a pointer to member”C++ Visual Studio 2015“非标准语法;使用 '&' 创建指向成员的指针” 【发布时间】:2016-09-21 17:10:34 【问题描述】:我使用 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':非标准 句法;使用 '&' 创建指向成员的指针
我的错误是什么以及如何改正?
【问题讨论】:
@PeteBecker 该函数的参数 (GetBool
) 是一个采用 bool 的函数,它不适用于成员函数。
你不能那样做。非静态类成员函数不是函数,例如它们不能像函数一样被调用。
投票结束,因为不清楚你在问什么。请参阅my comment-as-answer 以获得一些关于此的有用评论。
【参考方案1】:
我猜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);
【讨论】:
【参考方案2】: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);
【讨论】:
即使你改变了,你也不能在没有实例的情况下调用成员函数。 @Borgleader:没错;答案已修复(我希望没有错误) @shrike 我在这一行收到错误expected a member name
:setting->(*func)(&b);
@shrike 太棒了!谢谢。【参考方案3】:
这不是一个真正的答案,所写的问题不承认答案,但这太长且太详细,无法评论。
您没有展示完整的示例,因此必须猜测。
显然,从错误信息来看,settings
是一个指向类类型对象的指针,其中该类有一个成员函数get_StopIfGoingOnBatteries
。
显然,从->
运算符的使用来看,它是一个非static
成员函数。如果是static
,你仍然可以使用->
,但这会很不自然。所以假设它是一个非static
成员函数。
然后你不能轻易地形成一个指向调用该成员函数的函数的原始指针,因为你需要一个this
-指针来调用。如果创建这样的对象很便宜,它可以只使用一个虚拟对象,或者它可以使用全局实例或指向实例的指针。但是最好在你的设计中改变一些东西,和/或更清楚地解释你想要什么。
【讨论】:
以上是关于C++ Visual Studio 2015“非标准语法;使用 '&' 创建指向成员的指针”的主要内容,如果未能解决你的问题,请参考以下文章
在 Microsoft Visual Studio 2015 的 C++ 项目中包含 Armadillo C++ 库
加载 Visual Studio 2015 C++ 项目时出错,如何调试
Visual Studio 2015 Update 1 中的 C++ 内部编译器错误
如何在 Visual Studio 2015 中成功导出 C++ 项目模板?