'xxx' declared as a 'virtual' field ----一个奇怪的C++bug

今天在编写CheckerStandard模块时遇到了一个奇怪的bug,而后查得解决办法,特在此记录。
头文件里的类差不多是这样的:

//StandardChecker.hpp
#include "Checker.hpp"
#include "Sandbox.hpp"
namespace JudgeSystem{
    class StandardChecker final : public Checker {
    public:
      ......
      virtual SubmissionReport &&check(shared_ptr<ProblemConfig> t_config);

    private:
      .......
      std::shared_ptr<Sandbox> m_sandbox;
    };
}

关于类的具体实现忽略实现忽略,因为与这里的bug无关。
然后运行时,报错是这样的:

CheckerStandard.hpp:8:37: error: ‘check’ declared as a ‘virtual’ field

相信看到这个报错,会有很多人跟我一样,一脸懵比。什么叫“ declared as a ‘virtual’ field”。最后查询了很多资料,把问题简化了:

struct A {
    virtual void* b(nonsense*, string*);
};

=> error: 'b' declared as a 'virtual' field

struct A {
    virtual void* b(string*, nonsense*);
};

=> error: 'nonsense' has not been declared

从上边2个struct和报错的比较,可以看出,其实问题不在函数名或函数所在域,而是因为有变量类型无法甄别,而最开始的地方,我也发现自己忘了在shared_ptr前加上std::,导致类型无法甄别。
最后还是要说一句,坑爹的C++呀,这报错,让人云里雾里。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值