2013-10-01 46 views
2

我得到一個編譯錯誤,當我打電話testcomp隔離的構造,其設計如下推導:從一個純虛模板類

template <typename R> 
class IComparable 
{ 
public: 
    virtual bool Equals(const R & rhs) const = 0; 
}; 

class TestComp : IComparable<char*> 
{ 
public: 
    std::string x; 

    TestComp(std::string & a) 
    { 
     x = a; 
    } 

    virtual bool Equals(const char* & a) const 
    { 
     return x == std::string(a); 
    } 
}; 

錯誤:

error C2259: 'TestComp2' : cannot instantiate abstract class due to following members:'bool IComparable<R>::Equals(const R &) const' : is abstract with [ R=char * ] 

,我可以不明白,因爲我將TestComp :: Equals定義爲與IComparable :: Equals相似的簽名。

我在嘗試各種解決方法時注意到的一件事是,如果我將兩個函數'Equals(R & rhs)const'從參數中刪除const,那麼我不會再收到此錯誤。

有人可以幫我理解這種行爲嗎?

回答

4

派生方法的簽名不正確。它應該是

virtual bool Equals(char* const& a) const 

注意,const是下一個最接近*&&&之前,即「應用」的類型,

  • const char* &,其等同於char const* &,指引用一個指向char的常量指針。

  • char* const&表示指向char的指針的常量引用。

  • const R&,相當於R const&,表示對R的常量引用。

2
const R & 

即一個const參考(或,迂腐,到const對象的引用)。

const char* & a 

即非const參考(至一個指針指向一個const對象);因此,它不會覆蓋以const爲參考的函數。你需要一個const參照非const指針:

char * const & a 

const始終資格的東西之前,除非它是在一開始,在這種情況下,有資格的第一件事。有些人建議養成一貫的習慣,即把它放在符合條件的東西之後,即R const &而不是const R &,以略微減少混淆的機會。