2017-04-22 4 views
3

仮想をオーバーライドしようとしていますが、キーワードoverride,finalおよびconstを後続の戻り値の型で使用しています。問題は派生クラスにあるようですが、コンパイラエラー(末尾の戻り値の型を指定していないと言っています)はあまり役に立ちません。コードはここにあります:https://wandbox.org/permlink/zh3hD4Ukgrg6txyE最後の戻り値の型を持つfinal、override、constの構文

さらに貼り付けます。私はさまざまな順序で遊んできましたが、それでも正しいものに見えません。助けていただければ幸いです。ありがとうございます。

#include<iostream> 
using std::cout; using std::endl; using std::ostream; 
////////////////////////////////////////////// 
//Base stuff 
class Base 
{ 
public: 
    Base(int i=2):bval(i){} 
    virtual ~Base()=default; 
    virtual auto debug(ostream& os=cout)const->ostream&; 

private: 
    int bval=0; 
}; 

auto Base::debug(ostream& os) const->ostream& 
{ 
    os << "bval: " << bval << endl; 
    return os; 
} 

/////////////////////////////////////////////// 
//Derived stuff 
class Derived : public Base 
{ 
public: 
    Derived(int i=2,int j=3):Base(i), dval(j){} 
    ~Derived()=default; 

    auto debug(ostream& os=cout) const override final->ostream&; // error here 

private: 
    int dval=0; 
}; 

auto Derived::debug(ostream& os) const override final->ostream& 
{ 
    os << "dval: " << dval << endl; 
    return os; 
} 

/////////////////////////////////////////////// 
//Testing! 
int main() 
{ 
    Base b(42); 
    b.debug()<<endl; 
    return 0; 
} 
+0

小さなビットを、あなたは(〜派生する必要はありません)=デフォルト;右? – Sheen

+0

実際、これは必須ではありません:) – pss

答えて

4

正しい構文は次のようになります

  1. overridefinalトレーリング戻り型指定を含むメンバ関数宣言、後に表示される必要があり、すなわち

    auto debug(ostream& os=cout) const ->ostream& override final; 
    
  2. overridefinalは、クラス定義外のメンバ関数定義で使用しないでください。defi nition、それらを削除するので、ちょうど:

    auto Derived::debug(ostream& os) const ->ostream& 
    { 
        os << "dval: " << dval << endl; 
        return os; 
    } 
    
+0

OPのバグをcopy'n'pastedしました:) 'debug'は' os'を返す必要があります! –

+0

もちろん、 'os'を返すのを忘れてしまった、ありがとう!質問:これらの仕様の構文を覚えていますか、それとも時間の経過とともに拾うものなのでしょうか?それとも、私が知っておくべきいくつかのルールがありますか?私はクラスメンバーの宣言だけで何をすべきか、宣言と定義の両方で何ができるかを覚えておらず、何がどこに行くのかを知ることができません(つまり、後の戻り値は 'override'と' const'の前になければなりません)。 – pss

+1

@pss _whatは宣言と定義の両方にあることができます_私の経験則:何かにオーバーロードできる場合は、宣言と定義の両方になければなりません。 – zett42

関連する問題