2012-01-20 1 views
1

Если я пытаюсь скомпилировать:Почему оператор == не автоматически синтезировали для вложенных классов в C++

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:

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

+8

'==' никогда автоматически синтезировали ... почему бы внутренние классы любое исключение –

+1

Прежде всего, он должен просто 'возвращение inner_ == rightSide.inner_', и, во-вторых, да, он не будет синтезирован для вас, потому что его значение неоднозначно. – Phonon

+0

Почему вы ожидали, что компилятор даст вам неявные операторы? Ср этот вопрос http://stackoverflow.com/questions/217911/why-dont-c-compilers-define-operator-and-operator – Useless

ответ

2

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

  • Конструктор по умолчанию,
  • Destructor,
  • Копирование и перемещение Конструкторы,
  • Copy-распайка и двигаться-операторы присваивания

Если вы хотите быть в состоянии для сравнения ваших типов вам придется писать собственные операторы сравнения. Если вы реализуете их как члены, то они должны быть объявлены 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

и деструкторы. –

+0

@phresnel: спасибо, я забыл об этом. –

+0

@phresndl destructors всегда сгенерированы – codekiddy

1

Вы не определяло 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_; 
} 
+0

Спасибо! оно работает. –

+0

Собственно, это ** не **, как операторы _should_ выглядят, но как они выглядят! Чтобы узнать, как выглядит _should_, вы хотите сделать его нечленом и, вероятно, взять параметры 'const &'.Первый для поддержки симметричных преобразований, последний для производительности и применим к аргументу левой руки 'const'. –

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

  • Нет связанных вопросов^_^