我正在开发一种玩具语言的编译器,并创建了一个结构来保存词法分析步骤的结果。现在我想创建一个结构来保存解析器的结果,所以我想我应该创建一个基本结构,因为它们都保存警告和错误,但一个有令牌,一个有语句。这就是我的结构的样子。
struct Result {
std::vector<Warning> warnings;
std::vector<Error> errors;
void add(Warning warning) { warnings.push_back(warning); }
void add(Error error) { errors.push_back(error); }
bool hasWarnings() { return warnings.size() > 0; }
bool hasErrors() { return errors.size() > 0; }
};
struct LexerResult : public Result {
std::vector<Token> tokens;
void add(Token token) { tokens.push_back(token); }
};
在我添加错误的代码部分,它看起来像这样。
result.add(Error { loc, "Unknown token" });
但是在更改结构后我收到此错误。
moo_compiler/lexer/lexer.cpp:272:36 No viable conversion from 'Warning' to 'Token'
当我依赖代码自动完成时,它需要这个。
result.Result::add(Error { loc, "Unknown token" });
但我不明白为什么。
默认情况下,如果在派生类中定义函数,它将完全隐藏基类中派生类命名空间中具有相同名称的任何函数。
这意味着
add
中的 LexerResult
成员函数隐藏了 add
中的 Result
成员函数。
要将基类中的函数带回到派生类的命名空间中,您可以使用
using
关键字:
struct LexerResult : public Result {
std::vector<Token> tokens;
using Result::add;
void add(Token token) { tokens.push_back(token); }
};