因此,如果我们想编写自己的函数,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/