You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在std::variant的visitor中使用基类及编译问题求解

问题成因

C++存在名字隐藏规则:如果派生类定义了和基类同名的成员函数,无论参数列表是否匹配,派生类的同名函数都会隐藏基类中所有同名的重载版本。
你定义的PrintAVisitor派生类中自行实现了Visit(const A&)方法,这就导致基类DoNothing中定义的Visit(const B&)、Visit(const C&)两个重载被隐藏,编译器在PrintAVisitor的作用域内查找Visit方法时,只能匹配到接收const A&参数的版本,传入B、C类型参数时找不到匹配的重载,因此编译失败。

解决方案

最简单的实现方式就是通过using声明,将基类的所有Visit重载引入派生类的作用域,避免名字隐藏:

class PrintAVisitor : public DoNothing{
public:
    // 引入基类所有Visit重载,避免名字隐藏
    using DoNothing::Visit;
    void Visit(const A&) override {std::cout << "just a\n";}
};

修改后再使用PrintAVisitor作为visitor即可正常编译运行:访问A状态时执行派生类重写的逻辑,访问B、C状态时执行基类的空实现。

内容的提问来源于stack exchange,提问作者Tom Davies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:24:02