我试图覆盖纯虚函数:
template <class P, class R> class Visitor {
public:
virtual ~Visitor() {}
virtual R visit(ASTNode& n, P p) = 0;
};
class ToStringVisitor : public Visitor<string, int> {
virtual string visit(ASTNode& n, int p) override {
return "";
}
}
然而,我收到错误:
error: 'virtual std::__cxx11::string ToStringVisitor::visit(ASTNode&, int)' marked 'override', but does not override
virtual string visit(ASTNode& n, int p) override {
为什么这不是最重要的?
我在SO上找到的其他问题都没有这样一个简洁的例子,或者超类中模板返回值的详细信息。
答案 0 :(得分:3)
方法的返回类型声明为int
,在您的情况下,这意味着string
,而不是foods =
{
"Apple": {
"Red": {
"Cal": "1",
"Taste": "4"
},
"Green": {
"Cal": "2",
"Taste": "6"
}
},
"Pizza": {
"Pesto": {
"Cal": "200",
"Taste": "9"
},
"Cheese": {
"Cal": "100",
"Taste": "11"
}
}
}
。
答案 1 :(得分:2)
在这一行:
class ToStringVisitor : public Visitor<string, int> {
parameter type (P) --^ ^-- return type (R)
您必须将string
与int
交换,因为它与应传递的参数(P = int
)和返回类型(R = string
)不匹配:
class ToStringVisitor : public Visitor<int, string> {
parameter type (P) --^ ^-- return type (R)
然后它将符合模板类声明。