2017-10-12 6 views
0

J'ai défini une classe de modèle et la surcharge d'un opérateur, ainsi:Utilisation de « ce » mot-clé dans la classe de modèle

template<class T = bool> 
class SparseMatrix 
{ 
public: 
    SparseMatrix(int msize); 
    //Multiplication by vectors or matrices 
    SparseMatrix<double> operator *(SparseMatrix<T> &s); 
    //Matrix exponentiation 
    SparseMatrix<double> pow(int n); 
}; 

La forme particulière de l'opérateur n'a pas d'importance, je pense. Avec l'opérateur surchargé, maintenant je peux faire des choses comme ceci:

int main(void) 
{ 
    int i; 

    SparseMatrix<bool> s = SparseMatrix<bool>(4); 
    SparseMatrix<bool> t = SparseMatrix<bool>(4); 

    //Here goes some code to fill the matrices... 

    SparseMatrix<double> u = t*s; //And then use the operator 

    return 0; 
} 

Cela fonctionne très bien. Pas d'erreur, il renvoie des résultats corrects, etc. Mais maintenant, je veux remplir la méthode pow de la classe, de cette façon:

template<class T> 
SparseMatrix<double> SparseMatrix<T>::pow(int n) 
{ 
    if (n == 2) 
    { 
     return (this * this); //ERROR 
    } 
    else 
    { 
     int i=0; 
     SparseMatrix<double> s = this * this; 

     while (i < n-2) 
     { 
      s = s * this; 
      i++; 
     } 
     return s; 
    } 

} 

Cependant, quand je vais à l'main et d'écrire quelque chose comme SparseMatrix<double> u = t.pow(2); je reçois une erreur indiquant que invalid operands of types 'SparseMatrix<bool>*' and 'SparseMatrix<bool>*' to binary 'operator*'. La multiplication est bien définie pour les matrices bool comme je l'ai déjà dit, alors, pourquoi le compilateur se plaint-il? Est-ce que je fais un mauvais usage de this? Comment puis-je corriger cette erreur?

Nous vous remercions de votre aide.

+4

Vous semblez oublier que 'this' est un * pointeur * vers l'objet. Devrait être très évident si vous lisez réellement le message d'erreur (qui mentionne le type 'SparseMatrix *'). –

+0

BTW, tous 'const' manquent. – Jarod42

+0

Et vous le trouverez beaucoup plus facile et plus efficace si vous implémentez 'operator * =()' ainsi que 'operator *()'. –

Répondre

3

this est un pointeur vers l'objet, pas l'objet lui-même. Dereferincing this devrait faire l'affaire.