2013-09-30 3 views
1

Я был здесь раньше, чтобы получить некоторую информацию о перегрузке * = и нашел, что это очень полезно.Перегрузка == и! =

Я сейчас пытаюсь перегрузить == и! =. Но я хочу, чтобы функции оператора не являлись членами.

Старайтесь не ненавидеть все мои блоки кода - я включил то, что, как я считаю, имеет отношение к проблемам.

В моем исходном коде, я объявляю функции:

bool operator==(const Statistician&, const Statistician&); 
// checks whether Stat1 == Stat2 
bool operator!=(const Statistician&, const Statistician&); 
// checks whether Stat1 != Stat2 

Позже я определить функции:

// Check if equal 
bool operator ==(const Statistician& Stat1, const Statistician& Stat2) 
{ 
if ((Stat1.get_length() == Stat2.get_length()) && 
    (Stat1.get_sum() == Stat2.get_sum()) && 
    (Stat1.get_mean() == Stat2.get_mean()) && 
    (Stat1.get_minimum() == Stat2.get_minimum()) && 
    (Stat1.get_maximum() == Stat2.get_maximum())) 
    return true; 
else 
    return false; 
} 

// Check if not equal 
bool operator !=(const Statistician& Stat1, const Statistician& Stat2) 
{ 
if ((Stat1.get_length() != Stat2.get_length()) && 
    (Stat1.get_sum() != Stat2.get_sum()) && 
    (Stat1.get_mean() != Stat2.get_mean()) && 
    (Stat1.get_minimum() != Stat2.get_minimum()) && 
    (Stat1.get_maximum() != Stat2.get_maximum())) 
    return true; 
else 
    return false; 
} 

В моей тест-пилота, я фактическое тестирование:

if (Stat1 == Stat2) {cout << "Equal";} 
if (Stat1 != Stat2) {cout << "Not Equal";} 

Остальная часть моего кода работает нормально, и они снова не являются функциями класса.

Но когда я компилирую я получаю эти ошибки:

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'Statistician' (or there is no acceptable conversion) 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(507): could be 'bool std::operator ==(const std::exception_ptr &,const std::exception_ptr &)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(512): or  'bool std::operator ==(std::nullptr_t,const std::exception_ptr &)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(517): or  'bool std::operator ==(const std::exception_ptr &,std::nullptr_t)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\system_error(426): or  'bool std::operator ==(const std::error_code &,const std::error_condition &) throw()' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\system_error(434): or  'bool std::operator ==(const std::error_condition &,const std::error_code &) throw()' 
     while trying to match the argument list '(Statistician, Statistician)' 

error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'Statistician' (or there is no acceptable conversion) 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(522): could be 'bool std::operator !=(const std::exception_ptr &,const std::exception_ptr &)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(527): or  'bool std::operator !=(std::nullptr_t,const std::exception_ptr &)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\exception(532): or  'bool std::operator !=(const std::exception_ptr &,std::nullptr_t)' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\system_error(443): or  'bool std::operator !=(const std::error_code &,const std::error_condition &) throw()' 
     c:\program files (x86)\microsoft visual studio 11.0\vc\include\system_error(450): or  'bool std::operator !=(const std::error_condition &,const std::error_code &) throw()' 
     while trying to match the argument list '(Statistician, Statistician)' 

После долгих исследований Интернет я до сих пор не знают, что означают эти ошибки.

Помощь? Благодаря!

+1

Вы объявляете этих операторов перед их первым использованием? – us2012

+3

Обратите внимание, что вам не нужно делать 'if (something) return true; else return false; ', вы можете просто сказать' return something; '. – juanchopanza

ответ

5

Прежде всего, ваш operator!= неправильно, он должен быть

if ((Stat1.get_length() != Stat2.get_length()) || 
    (Stat1.get_sum() != Stat2.get_sum()) || 
    (Stat1.get_mean() != Stat2.get_mean()) || 
    (Stat1.get_minimum() != Stat2.get_minimum()) || 
    (Stat1.get_maximum() != Stat2.get_maximum())) 
    return true; 
else 
    return false; 

(обратите внимание || вместо &&). А еще лучше, сделать что

return !(Stat1==Stat2); 

Теперь ошибки вы видите: Похоже, что вы забыли включить заголовок, который декларирует эти операторы в ЕП, где вы их используете. Или, если это не так, вам нужно проверить, в каких пространствах имен они находятся, и если их можно найти там, откуда они вызывают.

Просто, чтобы проверить: если вы говорите: «В моем исходном коде я объявляю функции:« вы имеете в виду заголовочный файл (*.h), а с «позже» вы имеете в виду файл реализации (*.cc), правильно?

+0

+1 Также упростите определение 'operator ==' как 'return (Stat1.get_length() == Stat2.get_length()) && ...;'. Лично я сделал бы операторов 'friend' и использовал' std :: tie' для реализации сравнений. – Praetorian

+1

@Praetorian Вы правы для опытных разработчиков, но, учитывая, что OP, очевидно, только начинает изучать операторов, давайте сделаем один шаг за раз и не убейте ее слишком большой информацией :) –

+0

Итак, для этой ошибки у меня есть объявление функции, а также определение в том же файле .cpp. Поэтому не должно быть никаких проблем с этим. Он говорит, что нет операторов, которые принимают статистик в качестве левого входа руки, и все же, когда я объявляю функции Заявляют это как (&, статистик статистик &) Так что я довольно потеряли прямо сейчас. – 404Cat

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