vector-Problem
-
Hi,
ich programmiere gerade mit dem gcc 3.2 (unter Suse-Linux) vor mich hin, als folgendes Problem auftritt:
#ifndef X_H #define X_H #include <vector> using namespace std; typedef double value_type; typedef int size_type; const value_type neutral_value=0; class X : public vector<vector<value_type> > { ... public: // constructors/destructors X(); X(const size_type,const size_type); ... }; #endif
#include <stdlib.h> #include <X.h> // Constructors/Destructors X::X() { clear(); } X::X(const size_type r,const size_type c) { clear(); if ((r<0)||(c<0)) {throw DimensionClash();} for (size_type i=0;i<r;i++) { vector<value_type> v; for (size_type j=0;j<c;j++) { v.push_back(neutral_value); } push_back(v); } }
Beim übersetzen wird mir dann folgendes mitgeteilt:
X.cpp: In constructor
X::X(unsigned int, unsigned int)': X.cpp:11: no matching function for call to
std::vector<std::vector<value_type, std::allocator<value_type> >,
std::allocator<std::vector<value_type, std::allocator<value_type> > > >::
push_back(const value_type&)'
/usr/include/g++/bits/stl_vector.h:490: candidates are: void std::vector<_Tp,
_Alloc>::push_back(const _Tp&) [with _Tp = std::vector<value_type,
std::allocator<value_type> >, _Alloc =
std::allocator<std::vector<value_type, std::allocator<value_type> > >]Meine Frage ist jetzt: Häää? Was habe ich denn jetzt falschgemacht? Bisher hatte ich solche Probleme mit vektoren noch nicht!
-
Ich weiss ned, ob es sich lohnt, in dem Construct den fehler zu finden ! :p
Du weisst schon, das beim vector bei der Werteuebergabe die Werte kopiert werden. Und das dein ausserer Vector den inneren Vector als Wert hat ... wenn dein Feld richtig gross wird, hat dein rechner sicher viel spass :p Oder dein Compiler optimiert gut :p
Das naechste : public vector<vector<value_type> > !
sieht ned so aus, als wuerdest du wegen Polymorphie erben oder ?
vector<vector<value_type> > benutzt du irgendwann mal als Basiszeiger ???Wenn nein -> Schmutz. Erbe nur um wiederverwendet zu werden, nicht um selbst wiederzuverwenden !
Mein Tipp, schreib dir ne Klasse mit nem eindimesionalen Vector als Member ...
Rechne die Koordinaten von 2 dimensional in eindimensional um ...Unterscheidest du zwischen den dimensionen. also zum beispiel ein 2,2 Feld ist nen anderes als nen 4,4 Feld, mach nen Template draus ... damit 2,2 und 4,4 nicht mehr typgleich sind ...
Ciao ...
Nachtrag :
typedef int size_type;
wieso benutzt nicht size_t ? muesste dein compiler doch kennen !