Почему оператор == не синтезируется автоматически для вложенных классов в C ++ - PullRequest
1 голос
/ 20 января 2012

Если я попытаюсь скомпилировать:

class Outer 
{
    class Inner 
    {
        int t;
    };
public:
    Inner inner_;
    bool operator ==(Outer rightSide);
};

bool Outer::operator ==(Outer rightSide)
{
    if (inner_ == rightSide.inner_)
        return true;
    return false;
}

Я получаю сообщение об ошибке:

/home/martin/Projects/Experimentation/Various-build-desktop/../Various/main.cpp:18: 
error: no match for ‘operator==’ in ‘((Outer*)this)->Outer::inner_ == 
rightSide.Outer::inner_’

Пожалуйста, просто я что-то делаю неправильно или это свойство C ++

EDIT:

О, я никогда не понимал, что оператор == никогда не синтезируется, я был настолько уверен, что он синтезирован, что я не стал проверять.
Спасибо Парапура Раджкумар!

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Операторы сравнения никогда не генерируются неявно.Только эти вещи:

  • Конструктор по умолчанию,
  • Деструктор,
  • Конструкторы копирования и перемещения,
  • Операции копирования и назначения перемещения

Если вы хотите иметь возможность сравнивать ваши типы, вам придется написать свои собственные операторы сравнения.Если вы реализуете их как члены, то они должны быть объявлены const;в противном случае будет невозможно сравнивать постоянные объекты.Вы также можете рассмотреть возможность использования аргументов в качестве постоянных ссылок, чтобы избежать ненужного копирования;это не имеет большого значения для простых типов, подобных этим, но может быть гораздо более эффективным для больших или сложных классов.Что-то вроде:

bool Outer::operator==(Outer const & rhs) const {
    return inner_.t == rhs.inner_.t;
}

или как функция, не являющаяся членом:

bool operator==(Outer const & lhs, Outer const & rhs) {
    return lhs.inner_.t == rhs.inner_.t;
}
1 голос
/ 20 января 2012

Вы не определили operator== для class Inner. Итак, ваш код должен быть:

class Outer
{
    class Inner
    {
        int t;
    public:
        bool operator == (Inner inner)
        {
            return t == inner.t;
        }
    };
public:
    Inner inner_;
    bool operator == (Outer rightSide);
};

bool Outer::operator == (Outer rightSide)
{
    return inner_ == rightSide.inner_;
}
...