2017-04-22 20 views
3

我想覆蓋虛擬,但也使用關鍵字override,finalconst,尾隨返回類型。這個問題似乎是在派生類中,編譯器錯誤(說我沒有指定尾隨返回類型)不是太有用。代碼在這裏:https://wandbox.org/permlink/zh3hD4Ukgrg6txyE最後一個,覆蓋,常量與尾隨返回類型的語法

並粘貼在下面。我已經玩過不同的順序,但仍似乎無法得到正確的結果。任何幫助將不勝感激,謝謝。

#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以外的成員函數定義一起使用定義,因此只需將其刪除:

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

你已經copy'n'pasted OP的bug :)'debug'必須返回'os'! –

+0

哦,當然忘了返回'os',謝謝!問題:你如何記住這些規範的語法,還是隻是隨着時間的推移纔會出現?還是有一些我應該知道的規則?我一直無法記住什麼應該只在類成員聲明中,什麼可以在聲明和定義中,並且無法知道哪裏會發生什麼(即,尾隨返回應該在'override'和'const'之前)。 – pss

+1

@pss _什麼可以在聲明和definition_中 - 我的經驗法則:如果你可以重載某些東西,它必須在聲明和定義中。 – zett42

相關問題