2010-10-02 2 views
2
void add(sparseMatrix<T> &b, sparseMatrix<T> &c); // c is output 

sparseMatrix<T> operator+(sparseMatrix<T> &b); 

Я создаю разреженную матрицу, которая состоит из ArrayList из однократно связанных списков матричных терминов (матричные члены содержат строку, столбец и значение). У меня проблемы с перегрузкой оператора +. У меня есть метод добавления, который работает отлично, но когда я пытаюсь использовать его перегрузить оператор + я получаю следующие ошибки:C++: перегрузка оператор + для разреженной матрицы

sparseMatrix.cpp: In function ‘int main()’: 
sparseMatrix.cpp:268: error: no match for ‘operator=’ in ‘c = sparseMatrix<T>::operator+(sparseMatrix<T>&) [with T = int](((sparseMatrix<int>&)(& b)))’ 
sparseMatrix.cpp:174: note: candidates are: sparseMatrix<T>& sparseMatrix<T>::operator=(sparseMatrix<T>&) [with T = int] 
make: *** [sparseMatrix] Error 1 

Вот моя реализация для перегруженного оператора +:

sparseMatrix<T> sparseMatrix<T>::operator+(sparseMatrix<T> &b) 
{ 
     sparseMatrix<T> c; 

add(b, c); 
return c; 

} 

Строка в главном, которая дает ошибку: c = a + b (a, b, c - все разреженные матрицы). Обратите внимание, что если я делаю a.add (b, c), все работает нормально. Я также перегрузил оператор =, который работает, когда я делаю a = b и т. Д., Но, похоже, он жалуется на это в сообщении об ошибке, которое я опубликовал. Я действительно не уверен, в чем проблема. Есть идеи?

+0

hmm, от QUICKLY сканируя ваш вопрос, подтвердите вывод оператора +. Он возвращает то, что нужно? –

+0

Я даже не могу его скомпилировать, когда пытаюсь использовать оператор +, поэтому я не могу проверить вывод – murkilator

+0

Возможно, вас заинтересует 'boost :: ublas :: sparse_matrix': http: //www.boost. org/doc/libs/1_44_0/libs/numeric/ublas/doc/matrix_sparse.htm –

ответ

7

note: candidates are: sparseMatrix& sparseMatrix::operator=(sparseMatrix&)

Ваш operator= должен принять константный ссылку.

Если ссылка не const, она не может быть привязана к временному, поэтому оператор присваивания не может использоваться для временного объекта, созданного a + b.

(То же самое верно и для operator+, здесь также аргумент должен быть const sparseMatrix<T> & Кроме того, этот метод должен быть объявлен как константы, так как она не изменяет объект он вызывается.).

+0

+1. Хороший catch ':)' –

+0

Я все еще изучаю C++, и const всегда вызывает у меня проблемы. Когда я пытаюсь добавить const к методу operator =, как вы сказали, я получаю следующую ошибку: sparseMatrix.cpp: 183: ошибка: передача 'const arrayList <цепочка >>' как 'этот' аргумент 'T & arrayList :: get (int) [с T = цепочкой >] 'отбрасывает квалификаторы: строка 183: for (int j = 0; j murkilator

+0

@ murkilator: Похоже, ваш метод 'get()' также должен быть const, например 'int get (int i) const {...}'. Методы, которые не меняют объект, на который они вызывают, должны быть объявлены как const, поэтому компилятор знает, что их можно использовать на постоянных объектах. – sth

0

STH: есть правильно поставил диагноз:

Но я бы сделал ваши операторы более стандартными.

class sparseMatrix 
{ 
    sparseMatrix(sparseMatrix const& copy); 
    sparseMatrix& operator=(sparseMatrix const& copy); 

    sparseMatrix& add(sparseMatrix const& value) // Add value to the current matrix 
    { 
     // Do Work. 
     return *this; 
    } 

    // Re-use add to implement the += operator. 
    sparseMatrix& operator+=(sparseMatrix const& rhs) 
    { 
     return add(rhs); 
    } 

    // Two things here: 
    // 
    // Implement the operator + in terms of the operator += 
    // 
    // This basically means that you make a copy of one parameter then add the other 
    // value two it. Because + is symmetric it does not matter which you copy and which 
    // you add to the copy. 
    // 
    // So we pass the parameter by value this will provide an implicit copy 
    // generated by the compiler. This will also help the compiler with NRVO 
    // Then we just add (*this) to the copy of the rhs. 
    sparseMatrix operator+(sparseMatrix rhs) 
    { 
     return rhs += *this; 
    } 
}