添加了一个基本结构,打破了重载

问题描述 投票:0回答:1

我正在开发一种玩具语言的编译器,并创建了一个结构来保存词法分析步骤的结果。现在我想创建一个结构来保存解析器的结果,所以我想我应该创建一个基本结构,因为它们都保存警告和错误,但一个有令牌,一个有语句。这就是我的结构的样子。

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" });

但我不明白为什么。

c++ inheritance struct
1个回答
0
投票

默认情况下,如果在派生类中定义函数,它将完全隐藏基类中派生类命名空间中具有相同名称的任何函数。

这意味着

add
中的
LexerResult
成员函数隐藏了
add
中的
Result
成员函数。

要将基类中的函数带回到派生类的命名空间中,您可以使用

using
关键字:

struct LexerResult : public Result {
    std::vector<Token> tokens;

    using Result::add;    
    void add(Token token) { tokens.push_back(token); }
};

演示

© www.soinside.com 2019 - 2024. All rights reserved.