template Klasse ist angeblich non-class type
lima-city → Forum → Programmiersprachen → C/C++ und D
ankern
argument
array
code
definition
element
ende
entsprechenden index
ersten element
folgende fehlermeldung
funktion
instanz
klammern
letzte element
nachfolgenden elemente
operator
testen
versuch
weiteren methoden
zeiger
-
Und wieder stehe ich vor einem Problem, das ich nicht verstehe:
Beim Versuch ein selbstgestricktes Array zu testen bekommen ich folgende Fehlermeldung:
arraytest.cpp: In function ‘int main()’: arraytest.cpp:20: error: request for member ‘size’ in ‘vIntArray’, which is of non-class type ‘MyArray<double>()’
Die main:
#include <stdlib.h> #include <iostream> #include "MyArray.h" int main() { MyArray<double> vIntArray(); std::cout << vIntArray.size(); return (EXIT_SUCCESS); }
MyArray.h:
#ifndef _MYARRAY_H #define _MYARRAY_H #include "MyArrayElement.h" #include <iostream> template<typename tType> class MyArray { private: MyArrayElement<tType>* mpcAnchor; //Der Anker verweist auf das erste Element des Arrays MyArrayElement<tType>* mpcLast; //Ein Zeiger auf das letzte Element des Arrays unsigned int miSize; public: MyArray(); //Initiiert das Array mit Länge 0 MyArray(MyArrayElement<tType>* pcAnchor); //Initiiert das Array mit einem ersten Element MyArray(MyArray<tType> const& cOriginal); //Der Kopierkonstruktor stellt sicher, dass der Inhalt mit kopiert wird ~MyArray(); //Der Destruktor stellt sicher, dass am Ende alle Elemente gelöscht werden. MyArray<tType>& operator=(MyArray<tType> const& cOriginal); tType& operator[](unsigned int const& iIndex); //gibt das Element mit dem Entsprechenden Index zurück (Indizierung beginnt mit 0) unsigned int size(); //bestimmt die Anzahl der Elemente im Array void add(tType const& vElement); //fügt ein Element am Ende des Arrays hinzu void del(unsigned int const& iIndex); //löscht das Element mit dem übergebenen Index; alle nachfolgenden Elemente rücken auf. void resize(unsigned int iNewSize); //Ändert die Größe des Arrays; Wird das Array dabei verkleinert werden entsprechend viele Elemente vom Ende gelöscht; wird das Array vergrößert werden am Ende entsprechend viele neue Elemente angehängt und mit 0 initiiert. }; template<typename tType> std::ostream& operator<<(std::ostream& vStream, MyArray<tType> const& vArray); //für die Ausgabe #endif /* _MYARRAY_H */
Definition des verwendeten Konstruktors:
template<typename tType> MyArray<tType>::MyArray() : miSize(0) { };
Definition von size()
template<typename tType> unsigned int MyArray<tType>::size() { return miSize; };
Wahrscheinlich bin ich einfach nur zu doof, aber ich finde nichts, warum meine Klasse auf einmal keine mehr sein soll... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Versuch mal die Klammern beim Konstruktor von vIntArray in main.cpp rauszunehmen, also:
int main() { MyArray<double> vIntArray; ....
-
Ja, das hat geholfen, danke.
Auch wenn ich nicht verstehe warum... -
Eine mögliche Erklärung (bin mir aber nicht 100% sicher) wäre die Folgende:
Wenn man in C++ ein Object auf dem Stack erzeugt, d.h. als lokale Variable und ohne 'new' und der Konstruktor keine Argumente entgegennimmt, dann dürfen keine Klammern angegeben werden.
Der Ausdruck
MyArray<double> vIntArray();
enthält aber leere Klammern, was dem Kompiler normalerweise sagt, dass es eine Funktionsdeklaration ist.
Also der Kompiler meint, dass Du eine Funktion mit Namen 'vIntArray' deklarierst, die keine Argumente entgegennimmt und eine Instanz der Klasse 'MyArray<double>' zurückgibt.
Und da eine Funktion keine Klasse ist und folglich auch keine weiteren Methoden beinhalten kann, kommt der Fehler. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage