C++基础:未解析的重载函数类型

C++ basics: unresolved overloaded function type

我是 C++ 的新手,可能我遇到了幼稚的问题。我知道还有其他类似的问题,但与(在我看来)比我的更复杂的问题有关。 我正在尝试使用 C++ 为 Arduino 制作固件,但我因过载错误而受伤。

我在 cpp 文件中定义了这段代码:

void class1::functionA(void)
{
  object2.functionOfClass2(class1::functionB);
}

class1初始化为:

class class1
{
 public:
 void functionA(void);
 void functionB(void);
 private:
}

并在编译中给出

no matching function for call to 'class2::functionOfClass2(<unresolved overloaded function type>)'

转化为实际:

在我的代码中,我在 Arduino 库的 class1 的成员函数中使用 Wire 库,其中 object2class2 分别是 Wire class 的对象 TwoWire.

我需要在 class1 的成员函数中调用 wire 库。 这个解决方案是之前课程的结果,在课程中我了解到我不能在非成员函数中调用 class1 的成员函数,因为实例化无法生成非成员函数,因为 class 尚未实例化为对象,编译器不知道如何执行此操作。

但是在成员函数中调用 Wire. 对象,我认为这是可能的。但仔细想想,实际上,当将 class1 成员函数指针传递给 Wire 函数时,编译器无法知道什么传递给 wire,因此以下是错误的:

void class1::functionA(void)
{
  Wire.onRequest(class1::functionB); //wrong
}

其中 onRequest 接受 void (*)(void) 函数。

所以尝试

void class1::functionA(void)
{
  Wire.onRequest(&class1::functionB); //wrong
}

错误变成:

error: no matching function for call to 'TwoWire::onRequest(void (class1::*)())' candidates are: void TwoWire::onRequest(void (*)())

有办法让这些东西起作用吗?如果我说 staticinitializer list,我是否使用了正确的关键字?

&class1::functionB 是指向成员函数的指针,而不是指向函数的指针。它的类型是 void (class1::*)(void),而不是 void (*)(void),正如 onRequest 方法所期望的那样。这意味着要调用这个指向成员函数的指针,也需要有实例(class1*)。

如果 class1 是单例,解决这个问题最简单的方法可能是使 functionB 成为静态成员或只是一个非成员函数(不在任何 class 中) .

如果 class1 不能被假定为单例,那么库必须有一种方法可以沿着指向函数的指针传递上下文指针(通常 void*),并且这个上下文是回调函数。您应该将 this 作为上下文和指向包装函数的指针传递,如下所示:

void wrapper_for_class1_functionB(void* context)
{
    static_cast<class1*>(context)->functionB();
}

void class1::functionA(void)
{
    Wire.onRequest(&wrapper_for_class1_functionB, this);
}