Ez a kódrészlet:
(cat vektorKiir.cpp)
#include < iostream>
#include < vector>
using std::cout; using std::endl; using std::vector;
int vektorKiir(const vector <int> & VEK)
{
vector<int>::iterator szamlalo_VEK;
for (szamlalo_VEK=VEK.begin(); szamlalo_VEK != VEK.end(); szamlalo_VEK++)
{
cout << *szamlalo_VEK << " " ;
}
cout << endl;
return 0;
}
Ha a függvényparaméter vektor referencia nem konstansként van megadva:
int vektorKiir(const vector & VEK)
helyett
int vektorKiir(vector & VEK)
akkor nincs hibaüzenet, lefordul a program és rendesen fut is.
Ha fordítom konstans referenciával:
g++ -c *cpp
vektorKiir.cpp: In function 'int vektorKiir(const std::vector >&)':
vektorKiir.cpp:10: error: no match for 'operator=' in 'szamlalo_VEK = ((const std::vector >*)VEK)->std::vector<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator]()'
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator.h:634: note: candidates are: __gnu_cxx::__normal_iterator > >& __gnu_cxx::__normal_iterator > >::operator=(const __gnu_cxx::__normal_iterator > >&)
Mi ennek az oka? Mi van a dolog hátterében?
- 1188 megtekintés
Hozzászólások
nem lehet, hogy const iterator kene?
- A hozzászóláshoz be kell jelentkezni
De.
- A hozzászóláshoz be kell jelentkezni
Sajnos konstans iterátorral sem működik.
Az volt az első amit próbáltam. Kérdés, hogy ha az iterátor konstans, akkor tulajdonképpen mi is van? Maga az iterátor konstans, vagy amire mutat? Ha az, amire mutat, akkor miért kell konstansnak lennie? Azért, mert így nyilatkoztatik ki, hogy az, amire mutat nem megváltoztatható? Nyilván nem maga az iterátor módosíthatatlan, hiszen akkor mindig ugyanoda mutatna.
Ez a panasz konstans iterátorral:
vektorKiir.cpp: In function 'int vektorKiir(const std::vector >&)':
vektorKiir.cpp:11: error: no match for 'operator=' in 'szamlalo_VEK = ((const st d::vector >*)VEK)->std::vector<_Tp, _Alloc>::begin [wit h _Tp = int, _Alloc = std::allocator]()'
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterato r.h:634: note: candidates are: __gnu_cxx::__normal_iterator > >& __gnu_cxx::__normal_iterator > >::operator=(const __gnu_cxx::__normal_iterator > >&)
vektorKiir.cpp:11: error: passing 'const __gnu_cxx::__normal_iterator > >' as 'this' argument of '__gnu_cxx::__normal _iterator<_Iterator, _Container> __gnu_cxx::__normal_iterator<_Iterator, _Contai ner>::operator++(int) [with _Iterator = int*, _Container = std::vector >]' discards qualifiers
Bár valóban, hogy az iterátorról lehagytam a const-ot, más a panasz.
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
Hm. Lehetséges, hogy nem lennél tisztában azzal, hogy vannak iterator-ok és const_iterator-ok, valamint hogy utóbbi nem ekvivalens egy const-ként deklarált iterator-ral?
- A hozzászóláshoz be kell jelentkezni
Bármi lehetséges. "hangosan" gondolkodtam. Esetleg némi ötlet, hogy mi lehet az oka annak, hogy const vector& esetén miért akad panasz? Vagy RTFM a const_iterator témában?
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
http://209.85.129.132/search?q=cache:fJolwh7daXQJ:www.e-source.hu/jenci…
Szóval:
const vector::iterator szamlalo_VEK;
helyett
vector::const_iterator szamlalo_VEK;
Műxik. Ebben az esetben ugye a referenciaként átadott vektor a konstans, azaz nem tudom módosítani a vektort az adott függvényben?
Köszönöm a segítséget!
Guglizok tovább, mert szeretném megérteni azt, amit már tudok használni.
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
miert nem hasznalod tipussal? tudsz am olyat is csinalni, hogy kacsacsorben odairod a tipust :)
(fogalmam sincs hogy lehet megetetni a huppal a postot ugy, hogy bennevan, es a mod_security vagy mit hasznal trey ne szurje ki.)
- A hozzászóláshoz be kell jelentkezni
Igenigen! A forrásban benne volt, de nem kopipészteztem, hanem gépeltem és valahogy itt a nagy zűrzavarban kimaradt a kacsacsőr int kacsacsőrmásik.
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
< >
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Pedig egyszerű. Az a különbség, hogy az iterátor a konstans, vagy az amin iterál.
const vector<int>::iterator i=v.begin();
++i; //nem megy
*i=3; //megy
vector<int>::const_iterator ci=v.begin();
++ci; //megy
*ci=3; //nem megy
Ugyanez van mutatókkal is: a "const int*", és az "int* const" nem ugyanaz...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Köszönöm! Közben túrtam a netet és találtam is leírást a dologról, de ennyire tömören, érthetően sehol máshol nem olvastam róla :D
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni