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

时间:2016-10-16 14:24:40

标签: c++ arduino overloading overload-resolution

我对C ++很陌生,可能我有天真的问题。我知道还有其他微笑的问题,但与(在我看来)相关的问题比我的更复杂。 我正在尝试使用C ++为Arduino制作固件,并且我因为重载错误而伤害了自己。

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

string str = "insert into Market(Barcode,Name,Code,TemporaryStock,VatcodeID,Unit,NetValue,DiscountValue,UnderlyingValue,VatValue,TotalValue) select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + textBox1.Text + "', 'SELECT * FROM [datasheet1$H:R]')";

SqlCommand cmd2 = new SqlCommand(str.Replace(',', '.'), con);
cmd2.ExecuteNonQuery();

class1初始化为:

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

在汇编中给出了

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

转化为实践:

在我的代码中我在 class1 的成员函数中使用 Wire 库来存放Arduino库,在示例中 object2 class2 分别是 TwoWire 类的 Wire 对象。

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

但是在成员函数中调用 Wire。对象,我认为这是可能的。但实际上,当将 class1 成员函数指针传递给 Wire 函数时,编程器无法知道传递给 wire 的内容。 ,以下是错误的:

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

onRequest 接受void class1::functionA(void) { Wire.onRequest(class1::functionB); //wrong } 函数。

尝试使用

void (*)(void)

错误变为:

  

错误:没有匹配函数来调用'TwoWire :: onRequest(void   (1类:: *)())”       候选人是:void TwoWire :: onRequest(void(*)())

有办法让这些东西有效吗?如果我说 static 初始化列表,我是否正确使用正确的关键字?

由于

1 个答案:

答案 0 :(得分:1)

&class1::functionB是一个指向成员的函数,而不是一个指向函数的指针。其类型为void (class1::*)(void),而非void (*)(void),正如onRequest方法所预期的那样。这意味着要调用此指针指向成员函数,还需要具有该实例(class1*)。

如果class1是单身,解决​​此问题的最简单方法可能是使functionB成为静态成员,或者只是非成员函数(不在任何类中)。

如果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);
}