【发布时间】:2016-10-16 14:24:40
【问题描述】:
我对 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>)'
翻译成实用:
在我的代码中,我在 class1 的成员函数中为 Arduino 库使用 Wire 库,在示例中为 object2 和 class2 分别是 TwoWire 类的 Wire 对象。
我需要在 class1 的成员函数中调用 wire 库。 这个解决方案是上一课的结果,在其中我了解到我不能在非成员函数中调用 class1 的成员函数,因为无法进行非成员函数的实例化,因为该类尚未实例化为对象,编译器不知道如何执行此操作。
但是在成员函数中调用 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
}
错误变成:
错误:没有匹配的函数调用 'TwoWire::onRequest(void (class1::*)())' 候选人是:void TwoWire::onRequest(void (*)())
有办法让这些事情发挥作用吗?如果我说 static 和 initializer list,我是不是用正确的关键字走在正确的道路上?
【问题讨论】:
-
不得不删除我的答案。我不认为这显然是可行的。您需要将您的
class1实例的this传递给onRequest,如果它接受void (*)()(不允许使用参数),您就不能这样做。一个设计良好的库会改为将onRequest定义为onRequest(void (*callback)(void*), void* context),而您会将this传递为context。 -
唯一的方法是,如果你的整个应用程序中只有一个
class1实例 - 那么你可以无条件地替换这个实例并调用functionB。
标签: c++ arduino overloading overload-resolution