Template - Problem
-
Hallo zusammen,
ich habe folgendes Problem:
Ich habe eine Methode geschrieben, die Speicherplatz
für ein dreidimensionales Feld allokiert und einen Pointer
auf den Speicherbereich zurückgibt.Da ich das Feld für die Datentypen int und bool allokieren
will, dachte ich mir ich probiere es als Template - Funktion.Das sieht dann so aus (befindet sich in der Header - Datei):
/**Template - Funktion für Speicherreservierung*/
template<typename T>
***T feld_3D(int x, int y , int z){T ***array_3d;
array_3d = new (T** [y]);
for (int i = 0; i < x; i++){
for(int k=0;k<z;k++){
array_3d[i][k]=new (T[z]);
}
}
return array_3d;
}wenn ich kompilieren will kommen immer folgende Fehlermeldungen:
C:\Eigene Dateien\Markus\c++\Diplom\Segmentation.h(91) : error C2501: 'T' : Fehlende Deklaration
C:\Eigene Dateien\Markus\c++\Diplom\Segmentation.h(91) : error C2377: 'T' : Neudefinition; typedef kann nicht mit einem anderen Symbol ueberladen werden
C:\Eigene Dateien\Markus\c++\Diplom\Segmentation.h(91) : error C2061: Syntaxfehler : Bezeichner 'feld_3D'
C:\Programme\DevStudio\VC\INCLUDE\streamb.h(164) : error C2039: 'in_avail' : ist kein Element von 'streambuf'
C:\Programme\DevStudio\VC\INCLUDE\streamb.h(164) : error C2270: 'in_avail' : Modifizierer fuer FunktionenInsgesamt sind es über 100 Fehlermeldungen, fast alle bezogen auf streamb.h!
Ich verstehe gar nicht warum.
Kann mir da vielleicht jemand weiterhelfen?
Bitte nicht wundern wenn ich irgendwas total blödsinniges gemacht habe,
bin recht neu in dem Bereich c, c++!Gruß,
Markus
-
/*Template - Funktion für Speicherreservierung*/ template<typename T> T*** feld_3D(int x, int y , int z){//sterne falschrum T*** array_3d; array_3d = new T** [x]; for (int i = 0; i < x; ++i){//++i ist schneller wenn der compiler nicht optimiert array_3d[i]=new T*[y];//hat gefehlt for(int k=0;k<z;++k){//siehe ++i array_3d[i][k]=new T[z]; } } return array_3d; }
ansonste seh ich da nichts...
-
Vielleicht liegt es auch daran, dass du die Template-Funktion falsch aufrufst:
int*** array = feld_3D<int>(4, 4, 4); array[1][2][3] = 4;
-
Also ich hab die Funktion bisher noch gar nicht aufgerufen.
Nur in der Header - Datei deklariert.
Trotzdem kommen diese Fehlermeldungen.
Hab ich irgendwas offensichtliches falsch gemacht???Gruß,
Markus
-
Ok, Problem gelöst.
Danke an Otze.
Dein Code passt.Gruß,
Markus
-
coldAsIce schrieb:
Hab ich irgendwas offensichtliches falsch gemacht???
'T ***feld_3D' als '***T feld_3D' geschrieben
-
Wegen deinen Fehlermeldungen habe ich es versucht, bei mir zu kompilieren.
Es lief ohne Fehler durch und erfüllt auch seinen Zweck.#include <iostream> template <typename T> T*** create_array(int x, int y , int z) { T*** array = new T**[x]; for(int i = 0; i < x; ++i) { array[i] = new T*[y]; for(int j = 0; j < y; ++j) array[i][j] = new T[z]; } return array; } int main() { int*** array = create_array<int>(4, 4, 4); array[1][2][3] = 5; std::cout << array[1][2][3]; }
Edit: Hat sich ja nun erledigt
-
Na ja,
manchmal seh ich halt den Wald vor lauter Sternchen nicht! *g*
Finde es toll wie schnell man hier Hilfe bekommt.Gruß an Alle.
-
Wo das aber alles so schnell ging, hab ich noch ne Frage.
Und zwar möchte ich einen LIFO Stack haben, der dynamisch
erweitert wird (ohne dass zu Beginn eine Größe festgelegt werden muß).
In dem Stack möchte ich einen eigenen Datentyp ablegen.
Man könnte das ja auch generisch mit Templates machen.
Hab auch einige Beispiele gefunden, nur sie sind alle
statisch und ich versteh sie auch teilweise net so richtig.
Kann mir hier auch jemand helfen?Vielen Dank im Voraus,
Markus
-
coldAsIce schrieb:
Wo das aber alles so schnell ging, hab ich noch ne Frage.
Und zwar möchte ich einen LIFO Stack haben, der dynamisch
erweitert wird (ohne dass zu Beginn eine Größe festgelegt werden muß).
In dem Stack möchte ich einen eigenen Datentyp ablegen.
Man könnte das ja auch generisch mit Templates machen.
Hab auch einige Beispiele gefunden, nur sie sind alle
statisch und ich versteh sie auch teilweise net so richtig.
Kann mir hier auch jemand helfen?Vielen Dank im Voraus,
MarkusNehme doch einfach std::stack
-
du wirst nicht um die generische version rumkommen(solange du alle datentpen nicht von einer base ableiten willst), c++ hat nunmal ein statisches typsystem
//edit schau mal in der stl den stack an
-
Hallo,
also das mit dem STL Stack hab ich auch schon ausprobiert.
Bekomme hier auch Fehlermeldungen.
Vielleicht könnt ihr mir hier ja auch helfen.Also folgendermaßen siehts aus:
Ich habe eine Klasse Voxel von der ich Objekte auf den Stack legen will.
class Voxel{
private:
int u,v,w;
int value;public:
Voxel(int u, int v, int w, int val);
Voxel();
~Voxel();
int getWert();
int getU();
int getV();
int getW();};
Die Fehlermeldungen kommen kommen, wenn ich den Stack anlegen will:
stack <Voxel> voxels;C:\Eigene Dateien\Markus\c++\Diplom\source.cpp(34) : error C2065: 'stack' : nichtdeklarierter Bezeichner
C:\Eigene Dateien\Markus\c++\Diplom\source.cpp(34) : error C2275: 'Voxel' : Ungueltige Verwendung dieses Typs als Ausdruck
C:\Eigene Dateien\Markus\c++\Diplom\source.cpp(34) : error C2065: 'voxels' : nichtdeklarierter BezeichnerVielleicht könnt ihr mir hier auch weiterhelfen.
Gruß,
Markus
-
haste ein using namespace std; davor stehen?
achja, benutz demnächste
tags, das macht die sache lesbarer
-
Vielleicht hast du auch ein
#include <stack>
vergessen..
-
LOL,
dankeschön.
Ich komm mir hier schon total bedeppert vor.
Natürlich hat der namespace gefehlt.
Habs selbst gemerkt.Vielen Dank nochmal!!!