перегрузка оператора c++

Я пытаюсь выполнить перегрузку оператора в C++; по какой-то причине компиляция продолжает выдавать мне ошибку

ошибка: ‘bool Matrix::operator==(const Matrix&, const Matrix&)’ должен принимать ровно один аргумент

Теперь я знаю, что есть какой-то способ сделать это с одним аргументом, используя это, но я понял, что с помощью друга я могу сделать это таким образом, но он все еще не работает.

Вот мой код,

Заранее спасибо.

class Matrix{
public:
 Matrix();
 friend bool operator==(Matrix &mtrx1,Matrix &mtrx2);
 friend bool operator!=(Matrix &mtrx1,Matrix &mtrx2);

protected:
 std::vector<Cell> _matrix;
 int _row;
 int _col;

};

inline bool Matrix::operator==(const Matrix& mtrx1, const Matrix& mtrx2){

/* .......... */
}

person bass    schedule 20.09.2010    source источник
comment
Чтобы красиво отформатировать код, сделайте отступ в 4 пробела или выберите его и нажмите кнопку с цифрами 0 и 1.   -  person Mike Seymour    schedule 21.09.2010


Ответы (4)


Функция operator== member объявлена ​​как:

class foo {
  public:
    bool operator==( foo const & rhs ) const;
};

Функция operator== global объявлена ​​как:

bool operator==( foo const & lhs, foo const & rhs );

Как правило, сначала объявляется и определяется функция-член. Затем глобальная функция определяется в терминах функции-члена как

Только один между функцией-членом и глобальной функцией объявляется и определяется. Наличие обоих из них неоднозначно для таких утверждений, как (1) в следующем

foo f1;
foo f2;
bool f1EqualsF2 = (f1 == f2 );  // (1), ambiguous

и в таких случаях компилятор возвращает ошибку. В g++ сообщение об ошибке выглядит так

equals.cpp:24: error: ambiguous overload for ‘operator==’ in ‘f1 == f2’
equals.cpp:8: note: candidates are: bool foo::operator==(const foo&) const
equals.cpp:17: note:                 bool operator==(const foo&, const foo&)

Всякий раз, когда выполняется operator==, рекомендуется выполнить соответствующее operator!=.

person Arun    schedule 20.09.2010
comment
Не забудьте константу в методе operator==() - person Martin York; 21.09.2010
comment
Это не верно. Как правило, вы либо определяете функцию-член, или определяете свободную функцию. Вы не должны определять оба, иначе a == b обычно будет неоднозначным. Свободная функция обычно предпочтительнее, поскольку она приводит к согласованным правилам неявного преобразования как для левого, так и для правого операндов. В нынешнем виде вы не можете выполнить lhs.operator==( rhs ), поскольку operator== не является функцией-членом const и является private в foo. - person CB Bailey; 21.09.2010
comment
Спасибо Мартину Йорку и Чарльзу Бейли (+1 им); Я внес некоторые исправления в ответ (добавил const в функцию-член и квалификатор public). - person Arun; 21.09.2010
comment
Вы отредактировали, но все еще оставили предложение о том, что у вас есть как член operator==, так и глобальный operator== (один реализован в терминах другого). Это неправильно, потому что a == b будет неоднозначным, где a и b оба будут foo. - person CB Bailey; 21.09.2010

Хотя вы поместили объявление friend внутри класса, он не является членом. Таким образом, определение функции должно быть не членом:

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2) {...}

Вам также необходимо добавить квалификаторы const к аргументам объявлений, чтобы они соответствовали тем, что указаны в определении.

person Mike Seymour    schedule 20.09.2010
comment
Обратите внимание, однако, что объявление friend заставляет его быть не членом, поэтому даже если вы определите его на месте внутри определения класса, это действительно будет глобальная функция! - person Jerry Coffin; 21.09.2010
comment
@Jerry Coffin: или, точнее, функция, принадлежащая самому внутреннему пространству имен, содержащему данный класс. - person CB Bailey; 21.09.2010

class Matrix{
public:
    Matrix();
    friend bool operator==(const Matrix &mtrx1, const Matrix &mtrx2);
    friend bool operator!=(const Matrix &mtrx1, const Matrix &mtrx2);

protected:
    std::vector<Cell> _matrix;
    int _row;
    int _col;
};

inline bool operator==(const Matrix& mtrx1, const Matrix& mtrx2){
    /* .......... */
    return true;
}

Пройти компиляцию в Visual Studio 2005.

  1. опустите квалификатор const в объявлении вашего друга

  2. не нужно Matrix:: в работе == определение

person Yuncy    schedule 21.09.2010

Вы делаете это с двумя параметрами, если делаете это вне класса, а не как функцию-член.

В качестве функции-члена вам нужен только 1 параметр (другой параметр — *this)

person Brian R. Bondy    schedule 20.09.2010
comment
... и вам не понадобится друг, если вы реализуете как часть класса - person Steve Townsend; 21.09.2010