【问题标题】:Correct Template constructor for MBED Callback of member function成员函数的 MBED 回调的正确模板构造函数
【发布时间】:2016-12-11 07:26:46
【问题描述】:

我正在使用 mbed 库并希望将成员函数附加到 Ticker(定期调用回调函数),它也是成员。我的类可能有多个实例,我希望每个实例都能够管理自己的 Ticker 并允许回调函数处理其各自的数据。

代码:

* header */
class MyClass {
    uint16_t time;
    Ticker ticker;
    void Init();
    void SendMessage();
};

/* source */
void MyClass:: SendMessage() {
}

void MyClass::Init() {
    ticker.attach(Callback<MyClass>(this, &MyClass::SendMessage), time);
}

这给了我invalid use of incomplete type 'class mbed::Callback&lt;MyClass&gt;'

为什么成员函数指针的包装器需要完整的 MyClass?我是否缺少基本的东西,或者过于依赖Callback 类的实现?

Callback class

Ticker class

【问题讨论】:

    标签: templates g++ member-function-pointers incomplete-type mbed


    【解决方案1】:

    这不是关于 MyClass 不完整。这是关于 Callback&lt;MyClass&gt; 不完整。

    Callback 模板故意不完整。范围的唯一专业化是

    template <typename R>
    class Callback<R()>
    

    这意味着您需要向它传递一个函数类型,并且该函数必须没有参数。这称为类型擦除。可以从许多不同的类似函数的值构造回调,但结果类型始终为Callback &lt;some-plain-function-type&gt;。它的工作原理与std::function 非常相似,除了std::function 允许任意函数签名。

    由于您的回调返回 void,因此您需要这样的内容:

    ticker.attach(Callback<void()>(this, &MyClass::SendMessage), time);
    

    【讨论】:

    • 编译和测试。并澄清问题标题,因为它实际上不是一个不完整的类型问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2011-12-07
    • 2020-04-15
    • 2011-03-06
    • 1970-01-01
    • 2011-11-07
    • 2017-09-07
    相关资源
    最近更新 更多