【问题标题】:"a value of type "void (exeCallback::*)(int)" cannot be assigned to an entity of type "void (*)(int)"" [duplicate]“不能将“void (exeCallback::*)(int)”类型的值分配给“void (*)(int)”类型的实体”[重复]
【发布时间】:2012-11-21 06:29:17
【问题描述】:

可能重复:
Disabling “bad function cast” warning

我正试图围绕 C++ 函数指针展开思考。为了保持我的学习经验基本,我创建了一个测试函数指针示例。最后,我想通过引用传递所有准备好的实例化对象,这样我就可以回调对象的方法;但是,为了学习和理解,我想坚持 c++ 函数指针的基础知识。我只使用 .cpp 文件创建了一个工作示例,但我没有成功的部分是在 .cpp 和 .h 中使用函数指针。在使用 .cpp 和 .h 文件时,我做错了什么以使我的学习示例成功运行?

我创建了两个文件,exeCallback.h 和 exeCallback.cpp。

.h 文件

/*
File: exeCallback.h

Header file for exeCommand Library.
*/

#ifndef EXECALLBACK_H
#define EXECALLBACK_H

#include "mbed.h"

#include <map>

class exeCallback
{
public:
    exeCallback();

    void my_int_func(int x);

    void (*foo)(int);
private:
};

#endif

.cpp 文件:

/*
File: exeCallback.cpp

Execute functions in other Sensor libraries/classes

Constructor
*/

#include "mbed.h"
#include "ConfigFile.h"
#include "msExtensions.h"
#include "cfExtensions.h"
#include "exeCallback.h"

exeCallback::exeCallback()
{

    foo = &exeCallback::my_int_func;

    /* call my_int_func (note that you do not need to write (*foo)(2) ) */
    foo( 2 );

}

void exeCallback::my_int_func(int x)
{
    printf( "%d\n", x );
}

【问题讨论】:

  • 如果可能,请查看std::functionstd::bindstd::function 类允许您创建一个通用函数包装器,可以容纳任何类型的函数,std::bind 函数允许您将任何类型的函数绑定到函数类型变量。
  • @JoachimPileborg 和std::function 的可变参数构造函数让您在某些情况下无需显式使用std::bind 就可以进行绑定,这很好。

标签: c++ function-pointers


【解决方案1】:

错误告诉您,您正在尝试将指向成员函数的指针分配给指向(非成员)函数的指针。有关差异的更多信息,请参见[此处](错误告诉您正在尝试将指向成员函数的指针分配给指向(非成员)函数的指针。)。看来您需要将foo 声明为

void (exeCallback::*foo)(int);

或者使用std::function(或boost::function,如果您不支持C++11)让您的生活更轻松。

【讨论】:

  • 我将在获得基本了解和工作示例后立即查看您的建议。我相信我快到了。我现在收到的错误是:“表达式必须具有(指向)函数类型”然后我尝试了 exeCallback->foo(2),但我现在收到以下两个错误:期望标识符和期望类型说明符
  • @dottedquad 如果您展示了如何使用代码,可能会更容易。但是成员函数将一个指向其类参数类型的对象的隐式指针作为第一个参数。因此,您可能需要在回调中使用 `foo(this, 2);`。
  • @juanchopanzo 最后我想从通过串行通信接收到的文本中执行一个函数。因此,我不知道如何按照“我想如何使用代码”的方式显示代码,因为我仍在尝试获取函数指针的基本工作示例。很抱歉,当我试图解释我想要完成的事情时,我可能没有任何帮助。
  • @juanchopanzo 在进一步阅读您对“但是成员函数将隐式指针指向其类参数类型的对象作为第一个参数之后。因此您可能需要` foo(this, 2) ;` 在你的回调中。”我需要(this-&gt;*foo)(2); 新语法似乎成功了。
  • @dottedquad 很好,你想通了。 BTW 这两种语法是等价的。成员访问.-&gt; 是语法糖。
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
相关资源
最近更新 更多