如何在C ++中覆盖模板类中的纯虚函数?

时间:2017-08-18 07:00:35

标签: c++

我试图覆盖纯虚函数:

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上找到的其他问题都没有这样一个简洁的例子,或者超类中模板返回值的详细信息。

2 个答案:

答案 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)

您必须将stringint交换,因为它与应传递的参数(P = int)和返回类型(R = string)不匹配:

class ToStringVisitor : public Visitor<int, string> {
                   parameter type (P) --^      ^-- return type (R)

然后它将符合模板类声明。