fv param. referencia vektorra: const hibát ad, nem const nem ad hibát kérdés.

 ( lzrd | 2008. november 18., kedd - 14:17 )

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  & VEK)
    {
    vector::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?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

nem lehet, hogy const iterator kene?

De.

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

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?

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

http://209.85.129.132/search?q=cache:fJolwh7daXQJ:www.e-source.hu/jenci/jegyzetek/fejletpvizs.doc+iterator+const&hl=hu&ct=clnk&cd=18&gl=hu&lr=lang_hu

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

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.)

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

&lt; &gt;
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

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

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