Problem mit dynamischer Klasse in template Funktion
-
Hallo,
ich habe eine Klasse, die eine zweidimensionale Matrix darstellen soll, mit templates erstellt.
// Headerdatei von Matrixklasse // matrix.h template <typename T> class MATRIX2D{ protected: vector< vector<T> > matrix; // weiterer Quelltext };
In einer anderen Headerdatei habe ich eine Funktion, die diese Klasse als Zeiger benutzen soll:
//Funktionsheader // funktion.h template <typename T> double eigene_interpolation(MATRIX2D<T>* values, const double gesucht, const double kriterium){ // Quelltext }
Nun möchte ich beide Sachen in einer anderen Klasse anwenden:
// Klasse #include "matrix.h" #include "funktion.h" class anwenderklasse{ private: MATRIX2D<double>* _Werte_m; // usw. public: anwenderklasse(){ _Werte_m = new MATRIX2D<double>; return; // Mache damit etwas } // Ende Konstruktor void klassen_funktion(){ // Quelltext double wert = eigene_interpolation(_Werte_m, 3, 10^(-6)); // Quelltext } anwenderklasse(){ delete ~_Werte_m; return; } // Ende Dekonstruktor };
Die IDE Eclipse Indigo zeigt jetzt allerdings an:
Multiple markers at this line
- Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) 'Kann mir bitte einer erklären, was ich falsch mache bzw. nicht beachte?
Ich habe schon die Schreibweise
double wert = eigene_interpolation<double>(_Werte_m, 3, 10^(-6));
erfolglos ausprobiert.
Danke für Eure Hilfe
Thomas
-
Entschuldige,
falsches Forum
Das sollte in's C++
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Bitte komplettes Minimalbeispiel mit kompletter Fehlermeldung. Ich habe mehrere Verdachtsmomente, von denen ich nicht weißt, ob sie wegen der Kürzung für das Forum kommen oder echt sind.
Falls das das Minimalbeispiel sein soll:
Da fehlen mindestens schon einmal Includeguards und ein paar Includes.Allgemeine Fehler:
- Das Design mit dem Pointer als Klassenmember ist schlecht und zudem noch falsch umgesetzt.
- 10^(-6) ist höchstwahrscheinlich nicht, was du denkst, was es ist.
-
Das sieht irgendwie nicht nach C++ aus...
_Werte_m = new MATRIX2D<double>;
Erstens: Nutze bitte eine Initialisierungsliste.
Zweitens: Hier ist AFAICS keine dynamische Speicherallozierung nötig.
Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar (()
bzw.{}
) hinter den Typ.anwenderklasse(){ delete ~_Werte_m; return; } // Ende Dekonstruktor
Es heißt Destruktor; und die Tilde gehört nicht in das
delete
-Statement sondern vor den Klassennamen. Und es muss auch nicht an das Ende jeder Funktion die nichts zurückgibt einreturn
-Statement.10^(-6)
Das ist - wie SeppJ schon angedeutet hat - nicht , sondern 10 XOR -6. Wenn wir mit dem Zweierkomplement rechnen, dann ist das die folgende Rechnung:
00000000 00000000 00000000 00001010 ^ 11111111 11111111 11111111 11111010 // -6 = ~(6 - 1) = 11111111 11111111 11111111 11110000
Das hat den Wert -16.
-
Eigentlich möchtest Du:
template <typename T> double eigene_interpolation(MATRIX2D<T>& values, const double gesucht, const double kriterium){ // Quelltext }
und
class anwenderklasse{ private: MATRIX2D<double> Werte; // usw. public: anwenderklasse(){ // Mache damit etwas } // Ende Konstruktor void klassen_funktion(){ // Quelltext double wert = eigene_interpolation(Werte, 3, 1e-6); // Quelltext } ~anwenderklasse(){ } // Ende Destruktor };
-
Sone schrieb:
Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar (
()
bzw.{}
) hinter den Typ.Seit wann?
-
Thomas_Cpp schrieb:
Die IDE Eclipse Indigo zeigt jetzt allerdings an:
Multiple markers at this line
- Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) 'Und was sagt der Compiler?
-
lole schrieb:
Sone schrieb:
Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar (
()
bzw.{}
) hinter den Typ.Seit wann?
Hui! Zu viel Java des guten
-
Hallo allerseits,
danke für eure Antworten. Mit
void klassen_funktion(){ // Quelltext double wert = eigene_interpolation<double>(Werte, 3, 1e-6); // Quelltext }
ist es komischerweise aus Sicht des Compilers (g++) getan. Die Eclipse IDE meckert immernoch
Invalid arguments ' Candidates are: double eigene_interpolation(? *, double, double) ' ... line 76 Semantic Error
Vielleicht ein Bug!
Mein 10^6 habe ich jetzt auch durch ein pow ersetzt. Ein dummer Fehler von mir. Das kommt, wenn man den halben Tag MATLAB und den anderen Tag C++ benutzt.
Eine andere jetzt offene Frage:
C++:
_Werte_m = new MATRIX2D<double>;Erstens: Nutze bitte eine Initialisierungsliste.
Zweitens: Hier ist AFAICS keine dynamische Speicherallozierung nötig.
Drittens: Die Syntax ist falsch - da muss ein leeres Klammerpaar ( () bzw. {} ) hinter den Typ.Ich löse es momentan immer so, wenn ich eine Klasse mit einem speziellen (also mit Übergabe mehrerer Parameter) Konstruktor habe, und die als private/protected in eine andere Klasse integrieren möchte als pointer und dann new.
Beim new-Befehl kann ich dann den Konstruktor auswählen.
Im Destruktor muss ich lediglich darauf achten, dass ich den Speicherplatz wieder freigebe (delete).Es hört sich an, als wenn es dabei einen geschickteren Weg gibt.
cu && Danke
Thomas
-
Thomas_Cpp schrieb:
Es hört sich an, als wenn es dabei einen geschickteren Weg gibt.
Ja! Die genannte Initialisierungsliste. Unbedingt benutzen und new und delete vergessen.