今天在编写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++呀,这报错,让人云里雾里。。。