error: expected primary-expression before ‘.’ token
-
Folgenden Code hab ich geschrieben:
Matrix.h (Ausschnitt)Matrix<T> operator-( const Matrix<T> &B ) { if( rows != B.rows ) { std::cout << "Rows must be the same\n"; throw; } if( cols != B.cols ) { std::cout << "Cols must be the same\n"; throw; } Matrix<T> sum( rows, cols ); for( int i = 0; i < rows; ++i ) for( int j = 0; j < cols; ++j ) sum.A.at(i).at(j) = A.at(i).at(j) - B.A.at(i).at(j); return sum; }
und ASN_Classifier.cpp
#include "ASN_Classifier.h" double ASN_Classifier::classifyASN( Matrix<int> ASNs, Matrix<int> AnewVec, double* alpha, unsigned int alpha_length ) { unsigned int S = ASNs.rows; unsigned int I = ASNs.cols; Matrix<int> ASN_rowSum = ASNs.sumRows(); Matrix<int> ones( 1, S, true ); Matrix<int> sum = Matrix<int>.sumSum( ones.operator-( ASN_rowSum.operator-( alpha ) ) ); //hier ist Zeile 11! Aber hier steht ja eigentlich nix. }
Leider erhalte ich folgenden Compiterfehler, den ich nicht verstehe:
g++ -g -c ASN_Classifier.cpp -o ASN_Classifier.o
ASN_Classifier.cpp: In member function ‘double ASN_Classifier::classifyASN(Matrix<int>, Matrix<int>, double*, unsigned int)’:
ASN_Classifier.cpp:11: error: expected primary-expression before ‘.’ token
ASN_Classifier.cpp:11: error: no matching function for call to ‘Matrix<int>::operator-(double*&)’
Matrix.h:115: note: candidates are: Matrix<T> Matrix<T>::operator-(const Matrix<T>&) [with T = int]
make: *** [ASN_Classifier.o] Error 1Was passiert denn hier?
-
Matrix<int> sum = Matrix<int>.sumSum( ones.operator-( ASN_rowSum.operator-( alpha ) ) );
Hier rufst du den operator- von ASN_rowSum auf und übergibst ihm einen Wert vom Typ double*. Aber du hast den operator- nicht überladen um Werte von dem Typ anzunehmen.
Und überhaupt, wieso rufst du den Operator direkt auf?
-
Dachte zuerst, dass der Fehler dadurch auftritt, dass ich den Operator implizit benutze, war aber falsch.
Okay, hab total übersehen, dass alpha ein double Array war. Habs geändert.
#include "ASN_Classifier.h" double ASN_Classifier::classifyASN( Matrix<int> ASNs, Matrix<int> AnewVec, Matrix<int> alpha, unsigned int alpha_length ) { unsigned int S = ASNs.rows; unsigned int I = ASNs.cols; Matrix<int> ASN_rowSum = ASNs.sumRows(); Matrix<int> ones( 1, S, true ); int sum = Matrix<int>.sumSum( ones - ASN_rowSum - alpha ); }
Trotzdem erhalte ich immernoch den Fehler
g++ -g -c ASN_Classifier.cpp -o ASN_Classifier.o
ASN_Classifier.cpp: In member function ‘double ASN_Classifier::classifyASN(Matrix<int>, Matrix<int>, Matrix<int>, unsigned int)’:
ASN_Classifier.cpp:10: error: expected primary-expression before ‘.’ token
make: *** [ASN_Classifier.o] Error 1
-
HändyÄndy schrieb:
int sum = Matrix<int>.sumSum( ones - ASN_rowSum - alpha );
Matrix<int> ist ein Typ. Du kannst mit dem Punkt-Operator nicht auf Typen zugreifen.
-
Habs gemerkt, danke für die Antwort. Ich hätte folgenden Aufruf benutzen müssen, da sumSum static ist:
Matrix<int>::sumSum( ones - ASN_rowSum - alpha );
-
HändyÄndy schrieb:
Matrix<T> operator-( const Matrix<T> &B ) { if( rows != B.rows ) { std::cout << "Rows must be the same\n"; throw; }
Mal blöd gefragt: Was macht dieses "ausdrucklose" throw dort? Ich dachte, das kann man nur innerhalb eines catch-Blocks schreiben, um dieselbe Ausnahme, die man gefangen hat, weiterzuwerfen.
-
krümelkacker schrieb:
Mal blöd gefragt: Was macht dieses "ausdrucklose" throw dort? Ich dachte, das kann man nur innerhalb eines catch-Blocks schreiben, um dieselbe Ausnahme, die man gefangen hat, weiterzuwerfen.
Ein throw ohne Ausdruck kann überall stehen und wirft eine Exception, die gerade behandelt wird, weiter. Das kann sinnvoll sein innerhalb eines Handlers oder in einer Funktion, die von einem Handler aus aufgerufen wird. Wird gerade keine Exception behandelt, löst ein solcher Ausdruck allerdings den Aufruf von terminate() aus. In obigen ist das also wohl tatsächlich unzweckmäßig.
-
Was wäre denn in meinem Fall zweckmäßig?
-
HändyÄndy schrieb:
Was wäre denn in meinem Fall zweckmäßig?
Eine richtige exception zu werfen, die außerdem die Fehlermeldung enthält, statt dass du sie in der Konsole ausgibst.
-
So zB:
#ifndef STRINGEXCEPTION_H_ #define STRINGEXCEPTION_H_ #include <iostream> #include <string> class StringException { public: StringException( const std::string &msg ) { std::cout << msg << std::endl; }; }; #endif /* STRINGEXCEPTION_H_ */
und die werfe ich dann so:
if( M.cols != mu.cols ) throw StringException( std::string("cols != mu.cols != 1") );
-
zum Beispiel. Du könntest auch einfach eine der vorgefertigten exceptions aus <stdexcept> nehmen (z.B. std::logic_error). Was das "!= 1" ganz am Ende bedeuten soll ist mir allerdings noch schleierhaft...