2013-10-01 2 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* &, означает ссылка на 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 &, чтобы немного уменьшить вероятность путаницы.

Смежные вопросы