2017-08-18 33 views
3

私は純粋仮想関数上書きしようとしています。しかし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 { 

なぜこのオーバーライドではないでしょうか?

私が見つけることができる他の質問は、そのような簡潔な例、またはスーパークラスのテンプレート戻り値の詳細を持っていません。

+3

'virtual int visit(ASTNode&n、string p)override'または' Visitor ' –

答えて

2

テンプレートクラスの宣言に準拠します。

3

メソッドの戻り値の型はRと宣言されています。あなたの場合は、intで、stringではありません。その後、

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

:あなたはそれを渡す必要があるパラメータ(P = int)と戻り値の型(R = string)のミスマッチのでintstringを交換する必要が

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

:この行で

関連する問題