【问题标题】: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 以获得一些关于此的有用评论。

标签: c++ visual-studio com


【解决方案1】:

我猜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);
}

【讨论】:

    【解决方案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 namesetting-&gt;(*func)(&amp;b);
    • @shrike 太棒了!谢谢。
    【解决方案3】:

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

    您没有展示完整的示例,因此必须猜测

    显然,从错误信息来看,settings 是一个指向类类型对象的指针,其中该类有一个成员函数get_StopIfGoingOnBatteries

    显然,从-&gt; 运算符的使用来看,它是一个非static 成员函数。如果是static,你仍然可以使用-&gt;,但这会很不自然。所以假设它是一个非static 成员函数。

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

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2021-03-24
      相关资源
      最近更新 更多