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

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

Je crée une matrice creuse qui est constituée d'une liste de tableaux de listes simplement liés des termes de la matrice (les termes de la matrice contiennent la ligne, la colonne et la valeur). J'ai du mal à surcharger l'opérateur +. J'ai une méthode d'ajout qui fonctionne très bien, mais lorsque je tente de l'utiliser pour surcharger l'opérateur + je reçois les erreurs suivantes:C++: surcharge + opérateur pour une matrice creuse

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 

Voici ma mise en œuvre pour la surcharge opérateur +:

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

add(b, c); 
return c; 

} 

La ligne dans main qui donne l'erreur est c = a + b (a, b, c sont toutes des matrices creuses). Notez que si je fais a.add (b, c) tout fonctionne bien. J'ai aussi surchargé l'opérateur = qui fonctionne quand je fais a = b etc. mais il semble s'en plaindre dans le message d'erreur que j'ai posté. Je ne sais vraiment pas quel est le problème. Des idées?

+0

hmm, de numériser RAPIDEMENT votre question, confirmez la sortie de l'opérateur +. Est-ce qu'il rend ce qu'il devrait? –

+0

Je ne peux même pas le compiler quand j'essaie d'utiliser l'opérateur + donc je ne peux pas vérifier la sortie – murkilator

+0

Vous pourriez être intéressé par 'boost :: ublas :: sparse_matrix': http: //www.boost. org/doc/libs/1_44_0/libs/numérique/ublas/doc/matrix_sparse.htm –

Répondre

7

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

Votre operator= devrait prendre un const référence.

Si la référence n'est pas const, elle ne peut pas être liée à un temporaire, donc l'opérateur d'affectation ne peut pas être utilisé pour le temporaire créé par a + b.

(La même chose est vrai pour operator+, ici aussi l'argument doit être const sparseMatrix<T> & De plus, cette méthode doit être déclarée comme const, car il ne modifie pas l'objet auquel il est appelé..)

+0

+1. Bonne chance ':)' –

+0

Je continue d'apprendre le C++ et const me donne toujours des problèmes. Lorsque j'essaie d'ajouter const à la méthode operator = comme vous l'avez dit, j'obtiens l'erreur suivante: sparseMatrix.cpp: 183: error: en passant 'const arrayList >>' comme 'cet' argument de 'T & arrayList :: get (int) [avec T = chain >] 'supprime les qualificatifs: la ligne 183 est: pour (int j = 0; j murkilator

+0

@ murkilator: On dirait que votre méthode 'get()' devrait aussi être const, comme 'int get (int i) const {...}'. Les méthodes qui ne modifient pas l'objet sur lequel elles sont appelées doivent être déclarées const, afin que le compilateur sache qu'il est acceptable de les utiliser sur des objets constants. – sth

0

STH: a J'ai correctement diagnostiqué le problème:

Mais je rendrais vos opérateurs plus standard.

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; 
    } 
}