Klasse Vector in Template übergeben ?

MFC openGL

Erfahrenes Mitglied
Hallo,

ich würde gerne ein Objekt der Klasse Vector in eine Template Methode übergeben, wie mache ich das ?


Code:
int main()
{
  vector<int>* test;
  test->push_back(3);
  klasse<int> x = new klasse<int> (test);
}
 
 
template <class T>
class klasse{
 
 klasse(T y[])  //darf nicht verändert werden
   {
	  int size = y.size();
	  cout<<"größe des vector ist : "<<size<<endl;
   };
};


Fehler kommen diese hier :
"
test.cpp:12: error: no matching function for call to `klasse<int>::klasse(
std::vector<int,std::allocator<int>>*&)'
test.h:2: error: candidates are: klasse<int>::klasse(const klasse<int>&)
test.h:7: error: klasse<T>::klasse(T*) [with T = int]
"


Kann mir bitte einer verraten wie ich das machen muss damit ich den Vector übergeben kann ?

Danke schonmal
 
Du hast da einige Probleme in deinem Sourcecode.

Code:
vector<int>* test;
Warum ein Pointer? Wäre "vector<int> test;" hier nicht sinnvoller?

Code:
test->push_back(3);
Das wäre dann "test.push_back(3);"

Was genau dein Template machen solll, verstehe ich nicht ganz, aber wenn du das so machst, sollte es gehen:
Code:
 klasse( T& y )
   {
	  int size = y.size();
	  cout<<"größe des T ist : "<<size<<endl;
   };

Aber warum muss das im Konstruktor sein?
Übrigens musst du Objekte, die du mit "new" erzeugt hast, auch selber wieder mit "delete" freigeben.
 
Das ich einige Probleme habe merke ich schon, Kachelator ;)

Also mein größtes Problem ist das ich den Constructor nicht verändern darf... über sinn und Zweck brauchen wir uns auch nicht unterhalten, habe das nur so hingeschrieben damit man es schnell versteht was ich machen muss.

Code:
klasse( T y[] )	//<----------Das muss so stehen bleiben, ist eben so vorgegeben, kann ich nix dran ändern

Aber hatte nichtmal jemand gesagt das x[] = *x ist ? dann müsste ich doch da auch einen Pointer übergeben können, oder ?

Das mit den delete habe ich nur weggelassen weil ich das hier so auf die schnelle gemacht hatte, das ist nicht mein wirkliches Programm...



Also gibts auch ne Lösung mit klasse( T y[] ) ?
 
Hier noch eine Idee, allerdings würde ich sowas in der Praxis nicht gerne machen, weil unschön. Jedenfalls hast du recht mit dem Übergeben eines Pointers.
Du könntest das "T y[]" im Konstruktor einfach als "T* y" behandeln, was auch das selbe ist, und deinen vector dann so übergeben:
Code:
vector<int> test;
klasse<int> x = new klasse<int> (&test[0]);
Gehen würde es, und man kann so (indem man den Pointer auf das erste Element übergibt) auch beispielsweise API-Funktionen, die Pointer auf Arrays erwarten "hinter's Licht führen", aber schön finde ich es nicht. Besser wäre es, durchweg std::vector zu verwenden, wenn möglich.

Hier noch ein "Aber!" und ein Finderzeig, weswegen in der Aufgabe ein Wurm stecken muss:
Code:
klasse(T y[])  //darf nicht verändert werden 
   {
	  int size = y.size(); 
// wenn tatsächlich ein array übergeben
// wird, darf hier auch nicht auf eine 
// std::vector-Methode 
// zugegriffen werden! C-Arrays 
// (und ein solches wird übergeben)
// haben nämlich keine Methoden.
	  cout<<"größe des vector ist : "<<size<<endl;
   };
 
Hi Kachelator,

hoffe du kannst mir meinen Fehler zeigen, wieso das bei mir nicht geht.

Code der Cpp Datei :

Code:
#include "test.h"
int main()
{
  vector<int> test;
  test.push_back(3);
  klasse<int>* x = new klasse<int> (&test[0]);
  return 0;
}

Code der Header Datei :

Code:
#include <vector.h>

template <class T>
class klasse{
public :
 klasse(T y[])  //darf nicht ver\344ndert werden
   {
	  int size;
	  size = y.size();  //hier ist scheinbar der Fehler, aber ich weiss nicht wo...
	  cout<<"groesse des vector ist : "<<size<<endl;
   };
};

Fehler im G++ ist folgender :

test.h: In constructor `klasse<T>::klasse(T*) [with T = int]':
test.cpp:12: instantiated from here
test.h:13: error: request for member `size' in `y', which is of non-aggregate type `int*'


OS : Linux
Compiler : g++


Bin für jede Art von Lösung dankbar !

Gruss

MFC OpenGL


PS : Ich weiss das ich wieder kein delete benutzt habe, aber bin bei Testprogrammen schreibfaul *g*
 
Also:
Code:
  klasse(T y[])  //darf nicht ver\ändert werden
   {
	  int size;
	  size = y.size();  //hier ist scheinbar der Fehler, aber ich weiss nicht wo...
	  cout<<"groesse des vector ist : "<<size<<endl;
   };
Du hast den Fehler bereits selbst eingekreist. Hier wird nämlich nicht ein std::vector übergeben. y ist lediglich ein Pointer auf Integers und kennt als solcher die Methode size() nicht (sowie alle anderen std::vector-Methoden). Es gibt auch absolut keine vernünftige Möglichkeit, die Anzahl der Elemente innerhalb des Konstruktors festzustellen. Das ist eines der grossen Probleme, wenn man lediglich einen Arraypointer anstelle eines std::vectors übergibt. Man könnte natürlich die Anzahl als zweiten Parameter übergeben, aber das würde wieder eine Änderung des Konstruktors verlangen.

Hier noch einige Problemstellen, die mein Compiler (VC++) bemängelte:

Code:
#include <vector.h>
Die Datei kenne ich nicht. Die Klasse std::vector befindet sich jedenfalls in <vector>, nicht in <vector.h>.

Code:
cout
std::cout erfordert z.B. "#include <iostream>"

Code:
vector<int> test;
Code:
cout<<"größe des vector ist : "<<size<<endl;
vector und cout sind Elemente des Namespace std. Du musst das std:: entweder vor die Typnamen setzen (std::vector...) oder eine Using Anweisung verwenden (using namespace std;), damit der Compiler weiss, welche Klassen du meinst.

Dies hier lässt sich problemlos kompilieren:
Code:
#include <vector>
#include <iostream>
using namespace std;

template <class T>
class klasse{
public :
 klasse(T y[])  //darf nicht ver\344ndert werden
   {
	  int size = 0;
	  // size = y.size();  unmöglich!
	  cout<<"groesse des vector ist : "<<size<<endl;
   };
};

int main()
{
  std::vector<int> test;
  test.push_back(3);
  klasse<int>* x = new klasse<int> (&test[0]);
  return 0;
}

Naja, und dann gibt es natürlich noch ein "delete" zu wenig. :)
 
Zuletzt bearbeitet:
Da will mich jemand ärgern ;)

Alles klar, dann kann ich also im Constructor auf keinen Fall bei dem vorgegebenen Funktionskopf die Größe des Arrays bestimmen, dann bringt mir das alles nix, denn das ist umbedingt nötig.

Folge : Mail an den Prof....


Hatte das im Borland C Compiler versucht zu compilieren, ging aber net.... (da kannte er weder vector.h, noch vector)
...dann im g++ und dort gings nur mit vector.h, vector alleine fand er nicht...

Und das mit using namespace std und dem include<iostream> ist beim kopieren wohl verloren gegangen, evtl hab ichs nicht markiert gehabt, ist aber drin.

Das delete....AAAAAAAAAAAAAAARGH ;)

Aber danke für die Hilfe, auch wenns dann nicht so geht wie ichs eigendlich brauche.


Gruss

MFC OpenGL
 
Du kannst die Größe des Arrays natürlich in einer globalen Variablen zwischenspeichern und innerhalb des Konstruktors auslesen, aber das ist ein ziemliches Pfui-Bäh, und falls dein Prof behauptet, das sei eine vernünftige Lösung, dann wechsle schnellsten den Kurs. :)
 
Zurück