c++ - 如何用非类函数指针调用类成员函数?

标签 c++ c antlr3

因此,如果我们想编写自己的函数,ANTLR3C 似乎使用函数指针来允许用户覆盖它们。我需要覆盖错误报告功能:

指针

void(*displayRecognitionError)(struct ANTLR3_BASE_RECOGNIZER_struct * recognizer,
                                 pANTLR3_UINT8 * tokenNames);

函数

static void displayRecognitionError (pANTLR3_BASE_RECOGNIZER recognizer,
                                     pANTLR3_UINT8 * tokenNames);

现在我有以下内容:

@lexer::apifuncs {
  RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
}

@lexer::includes {
  #include "lexerData.h"

  static void displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
                                          pANTLR3_UINT8 * tokenNames);
}

@lexer::members {
  #include "lexerError.h"
}

在文件 lexerError.h 中使用新的错误代码(一切正常)。我试图通过将错误函数移动到 lexerData 类中来改变这一点,但不幸的是,当我尝试将函数指针设置为类成员时出现编译错误。

compileUnit.cpp:179:62: error: argument of type ‘void (lexerData::)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’ does not match ‘void (*)(ANTLR3_BASE_RECOGNIZER_struct*, uint8_t**)’

据我所知,这不是一个简单的转换或语法问题。我应该怎么做才能允许这样做?一种修复似乎是更改函数指针定义,但我需要能够将函数指针分配给不同的类,因为词法分析器使用不同的数据结构运行了两次。

最佳答案

一般情况下,不能简单地将成员非静态函数的地址赋值给指向非类函数的指针。您可以创建非类函数,它将调用 lexerData 类的适当成员函数。问题是这个非类函数必须能够以某种方式引用 lexerData 对象。我对 ANTLR3C 一无所知,所以很遗憾,我无法就此给您具体建议 :(

关于c++ - 如何用非类函数指针调用类成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241713/

相关文章:

python - 如何使用 python 运行 Hello world c++ 代码

将 int 转换为 'C' 中的 int[]

java - 使用 ANTLR 树语法复制树的节点

c - 在 C 目标中用 antlr3 解析一些特定的语句

parsing - 所有 ANTLR 语法都会产生错误 "no viable alternative at input ' <EOF >'"

c++ - 为什么我的 SFML 游戏只能在终端中运行?

c++ - 这行三元运算符的语法是什么

c++ - 内联一个重载的运算符c++

c - libevent2 和文件 io

c - qsort() 图结构数组