Я новичок в C++ и пытаюсь написать интерфейс, как показано ниже:
template <class T>
class Comparable
{
protected:
Comparable(){};
public:
virtual int compare(const T&&)=0;
int compare(const T& o)
{
return this->compare(std::move(o));
}
};
Я сделал это, чтобы попытаться заставить метод сравнения работать с обоими значениями l/r. Я получил следующий класс от Comparable:
class Monkey : Comparable<Monkey>
{
private:
char name[512];
public:
Monkey(const char*&& name)
{
strcpy(this->name, name);
}
const char *getName() { return name; }
int compare(const Monkey&& m)
{
return strcmp(name, m.name);
}
};
с помощью метода main() следующим образом:
Monkey m1(argv[1]), m2(argv[2]);
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1));
Но я получаю ошибку компиляции:
не удается связать lvalue «Tests::Monkey» с «const Tests::Monkey&&», инициализируя аргумент 1 «virtual int Tests::Monkey::compare(const Tests::Monkey&&)». Ошибка сборки
Почему вызов метода не привязан к методу сравнения в базовом классе?
Когда я создаю их как виртуальные в базовом классе и пишу их оба в производном классе, привязка работает нормально, но не работает, и я получаю ошибку компиляции, если пытаюсь скомпилировать ее так, как написано здесь.
compare
будет работать нормально. И передать ссылку rvalue наconst char*
? Это действительно не имеет особого смысла. Наконец, постоянные ссылки на rvalue также часто не имеют смысла. - person Some programmer dude   schedule 14.03.2017