перегрузка операторов c ++ - PullRequest
       30

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

0 голосов
/ 21 сентября 2010

Я пытаюсь предварительно перегрузить оператор в 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){

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

Ответы [ 4 ]

8 голосов
/ 21 сентября 2010

Функция 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!=.

5 голосов
/ 21 сентября 2010

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

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

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

3 голосов
/ 21 сентября 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. матрица не нужна :: в работе == определение

1 голос
/ 21 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...