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 库,其中 object2 和 class2 分别是 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 (*)())
有办法让这些东西起作用吗?如果我说 static 和 initializer 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);
}
我是 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 库,其中 object2 和 class2 分别是 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 (*)())
有办法让这些东西起作用吗?如果我说 static 和 initializer 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);
}