Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : template class const auf Funktion übergeben



RAHUL
11-05-2006, 11:06
Hallo,

ich habe mich ein wenig in C++ reingefuchst,
aber bin wieder raus.

Ich habe von dem Gruppenübungsleiter eine Template Klasse
einer Matrix zur Verfügung gestellt bekommen,
muß mit der die Matrixmultiplikation durchführen.

Nun habe ich mehrere Funktionen, an die ich die Template Klasse
konstant übergeben will, .z.B



69: int Mat_x_Mat(TRMatrix &c, const TRMatrix & a, const TRMatrix & b)
70: {
71: if(a.GetCols()!=b.GetRows())
72: {
73: printf("Matrizen können nicht multipliziert werden!");
74: return -1;
75: }
76
77: for(int ctr1=0; ctr1 < c.GetRows();++ctr1)
78: {
79: for(int ctr2=0; ctr2 < c.GetCols();++ctr2)
80: {
81: for(int i=0; i < a.GetCols() ; ++i)
82: {
83: c(ctr1,ctr2)=c(ctr1,ctr2)+a(ctr1,i)*b(i,ctr2);
84: }
85 }
86: }
87: return 0;
88:}


Nun habe ich mit templates noch nie was gemacht und weiß nicht,
ob man da etwas noch beachten muß, aber ist das normalerweise nciht sauberer so, dass ich die Matrizen a und b als const übergebe?

Auf jeden Fall gibt mir der Compiler als Antwort:


MatrixMultiplikation.cpp:71: error: passing `const TRMatrix' as `this' argument of `const int TMatrix<T>::GetCols() [with T = double]' discards qualifiers
MatrixMultiplikation.cpp:71: error: passing `const TRMatrix' as `this' argument of `const int TMatrix<T>::GetRows() [with T = double]' discards qualifiers


Warum ist das so, ich meine ich habe die Memberfunction auch noch auf const geändert, aber wo ist das Problem, da ist doch nur eine logische Abfrage? Was ist der Denkfehler?

Hier noch die Memberfunction



const int GetRows() { return const rows;};
const int GetCols() { return const cols;};


Danke für die Antworten

Mfg
Rahul

Joghurt
11-05-2006, 12:28
const int Klasse::foobar()sagt, dass die Methode einen const int zurückgibt. Was du willst, ist dass this als const Klasse* übergeben wird. Dies geht so:

int Klasse::foobar() const;

In deinem Falle also

int GetRows() const { return rows;};
int GetCols() const { return cols;};

RAHUL
11-05-2006, 13:58
Jo,
danke, da habe ich wohl einiges durcheinandergeworfen,

ich habe dann aber noch mal kompiliert,
aber dann will er auch den Operator aus Zeile 83 a(ctr1, i), bzw b(i, ctr2)const haben.

Ich habe den mal in der Klasse so const gesetzt,


T &operator ()(int i,int j) const { return p[i][j]; };
T *operator [](int i) const { return p[i]; };


dann sagt der Compiler mir aber
matrix.h:94: error: declaration of `operator()' as non-function
matrix.h:94: error: syntax error before `const'
matrix.h:95: error: syntax error before `*' token


Geht das const bei Operatoren nciht so einfach?

MfG
Rahul

locus vivendi
11-05-2006, 15:33
Poste mal ein komplettes Beispiel welches den Fehler hervorruft.

RAHUL
11-05-2006, 17:15
*Räusper* :o

Der Fehler war meine eigene Blindheit, bzw Dummheit,

Ich habe immer nur die alte Fehlerliste angeschaut,
weil bei neuem Compilieren, die Liste nur noch zwei
Zeilen lang waren und mir nicht als neue Fehlerliste aufgefallen sind.

Aber danke an euch beide.

MfG
Rahul