/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
vector< set< object > > problemer
Fra : Michael Rasmussen


Dato : 15-09-05 19:40

Hej alle,

Jeg har problemer med at se skoven for bare træer:

Mål: En klasse til håndtering af chained hash table. Alt virker på nær
en metode: returnere den samlede hash table som en vector < object >. Jeg
har prøvet med iterator på både vector og set, men alt ender i en
fejlmeddelelse i stil med denne:
.../include/hashtable.h: In member function 'std::vector<Object,
std::allocator<_CharT> > hashtable<Object>::gethashtable() const [with
Object = int]': main.cc:122: instantiated from here
.../include/hashtable.h:121: error: dependent-name
'std::vector<Object,std::allocator<_CharT> >::iterator' is parsed as a
non-type, but instantiation yields a type ../include/hashtable.h:121:
note: say 'typename std::vector<Object,std::allocator<_CharT> >::iterator'
if a type is meant ../include/hashtable.h:123: error: dependent-name
'std::vector<std::set<Object, std::less<_Key>, std::allocator<_CharT>
>,std::allocator<std::set<Object, std::less<_Key>, std::allocator<_CharT>
> > >::iterator' is parsed as a non-type, but instantiation yields a type

Relevante dele af class:

template< class Object >
class hashtable{
public:
.......
   std::vector< Object > gethashtable() const

private:
   //buckets is a vector of sets
   std::vector<std::set<Object> >    buckets;
   unsigned int         tableSize;

Hvordan får jeg løbet vector igennem fra start til slut og udtrukket
alle set<Object>, som indsættes i en ny std::vector< Object >?

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


 
 
Mogens Hansen (15-09-2005)
Kommentar
Fra : Mogens Hansen


Dato : 15-09-05 19:50


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2005.09.15.18.40.18.270531@miras.org...

[8<8<8<]
> Hvordan får jeg løbet vector igennem fra start til slut og udtrukket
> alle set<Object>, som indsættes i en ny std::vector< Object >?

Egentlig lige ud af landevejen:
#include <set>
#include <vector>

using namespace std;

class foo
{
public:
vector<int> bar();

private:
vector<set<int> > bar_;
};

vector<int> foo::bar()
{
vector<int> result;

for(vector<set<int> >::iterator i = bar_.begin(); bar_.end() != i; ++i) {
result.insert(result.end(), i->begin(), i->end());
}

return result;
}


Venlig hilsen

Mogens Hansen



Michael Rasmussen (15-09-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 15-09-05 20:20

On Thu, 15 Sep 2005 20:49:33 +0200, Mogens Hansen wrote:


> Egentlig lige ud af landevejen:
>
> vector<int> foo::bar()
> {
> vector<int> result;
>
> for(vector<set<int> >::iterator i = bar_.begin(); bar_.end() != i;
> ++i) {
> result.insert(result.end(), i->begin(), i->end());
> }
> }
> return result;
> }
> }
>
Synes også, jeg havde gjort det på den måde først. Har du tilpasset
din løsning til min template

std::vector< Object > gethashtable() const {
std::vector< Object > result;

for(std::vector<std::set<Object> >::iterator i = buckets.begin();
   buckets.end() != i; ++i)
{
   result.insert(result.end(), i->begin(), i->end());
}
      
return result;
}

private:
   //buckets is a vector of sets
   std::vector<std::set<Object> >    buckets;

Det giver dog stadigvæk samme fejl!

.../include/hashtable.h: In member function 'std::vector<Object,
std::allocator<_CharT> > hashtable<Object>::gethashtable() const':
.../include/hashtable.h:120: error: expected `;' before 'i'
.../include/hashtable.h:121: error: 'i' was not declared in this scope
.../include/hashtable.h: In member function 'std::vector<Object,
std::allocator<_CharT> > hashtable<Object>::gethashtable() const [with
Object = int]': main.cc:122: instantiated from here
.../include/hashtable.h:120: error: dependent-name
'std::vector<std::set<Object, std::less<_Key>, std::allocator<_CharT>
>,std::allocator<std::set<Object, std::less<_Key>, std::allocator<_CharT>
> > >::iterator' is parsed as a non-type, but instantiation yields a type
.../include/hashtable.h:120: note: say 'typename
std::vector<std::set<Object, std::less<_Key>, std::allocator<_CharT>
>,std::allocator<std::set<Object, std::less<_Key>, std::allocator<_CharT>
> > >::iterator' if a type is meant make[2]: *** [main.o] Error 1
make[2]: Leaving directory `/home/mir/Projects/hashing/src' make[1]: ***
[all-recursive] Error 1
make[1]: Leaving directory `/home/mir/Projects/hashing' make: *** [all]
Error 2

Er det en bug i compileren?
loke/Projects/hashing$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.0 --enable-__cxa_atexit
--enable-libstdcxx-allocator=mt --enable-clocale=gnu
--enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr
--disable-werror --enable-checking=release i486-linux-gnu Thread model:
posix
gcc version 4.0.2 20050913 (prerelease) (Debian 4.0.1-7)

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Mogens Hansen (15-09-2005)
Kommentar
Fra : Mogens Hansen


Dato : 15-09-05 20:33


"Michael Rasmussen" <mir@miras.org> wrote in message
news:pan.2005.09.15.19.19.34.948371@miras.org...

[8<8<8<]
> Har du tilpasset
> din løsning til min template

Nej - men det burde ikke spille nogen rolle.

[8<8<8<]
> Det giver dog stadigvæk samme fejl!

Hmm...

>
> ../include/hashtable.h: In member function 'std::vector<Object,
> std::allocator<_CharT> > hashtable<Object>::gethashtable() const':
> ../include/hashtable.h:120: error: expected `;' before 'i'

Det lyder som om den ikke syntes i er erklæret.
Prøv

std::vector<std::set<Object> >::iterator i;
for(i = buckets.begin(); buckets.end() != i; ++i)

selvom det er dårligere og ikke burde være nødvendigt.

[8<8<8<]
> Er det en bug i compileren?

Hvis det hjælper, så ja.

Venlig hilsen

Mogens Hansen



Michael Rasmussen (15-09-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 15-09-05 21:47

On Thu, 15 Sep 2005 21:32:40 +0200, Mogens Hansen wrote:

>> Har du tilpasset
>> din løsning til min template
>
> Nej - men det burde ikke spille nogen rolle.
>
Det var en typo, der skulle have stået: Har nu ...
>
> Hvis det hjælper, så ja.
>
Giver præcis samme fejl!
Prøvede lige:
loke/Projects/hashing/src$ gcc-3.2 -I../include main.cc testdata.o
gcc-3.2: installation problem, cannot exec `cc1plus': No such file or directory
loke/Projects/hashing/src$ gcc-2.95 -I../include main.cc testdata.o
.../include/hashtable.h: In method `class vector<int,allocator<int> > hashtable<int>::gethashtable() const':
main.cc:122: instantiated from here
.../include/hashtable.h:121: assignment to `set<int,less<int>,allocator<int> > *' from `const set<int,less<int>,allocator<int> > *' discards qualifiers

og

loke/Projects/hashing/src$ gcc-3.3 -I../include main.cc testdata.o
In file included from main.cc:26:
.../include/hashtable.h: In member function `std::vector<Object,
std::allocator<_CharT> > hashtable<Object>::gethashtable() const':
.../include/hashtable.h:119: warning: `std::vector<std::set<Object,
std::less<_Key>, std::allocator<_CharT> >, std::allocator<std::set<Object,
std::less<_Key>, std::allocator<_CharT> > > >::iterator' is implicitly a
typename
.../include/hashtable.h:119: warning: implicit typename is deprecated, please
see the documentation for details
/usr/include/c++/3.3/bits/stl_iterator.h: In constructor `
__gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const
__gnu_cxx::__normal_iterator<_Iter, _Container>&) [with _Iter = const
std::set<int, std::less<int>, std::allocator<int> >*, _Iterator =
std::set<int, std::less<int>, std::allocator<int> >*, _Container =
std::vector<std::set<int, std::less<int>, std::allocator<int> >,
std::allocator<std::set<int, std::less<int>, std::allocator<int> > > >]':
.../include/hashtable.h:121: instantiated from `std::vector<Object, std::allocator<_CharT> > hashtable<Object>::gethashtable() const [with Object = int]'
main.cc:122: instantiated from here
/usr/include/c++/3.3/bits/stl_iterator.h:598: error: invalid conversion from `
const std::set<int, std::less<int>, std::allocator<int> >* const' to `
std::set<int, std::less<int>, std::allocator<int> >*'

Denne fejlmeddelelse ser interessant ud. Først warning om at implicit
typename er deprecated

Åbenbart har andre samme problemer:
http://gcc.gnu.org/ml/gcc-help/2004-10/msg00179.html

Det ser ud til, at compileren ikke kan lide templates i denne situation.
Udskifter jeg Object med int, char eller string giver compileren ingen
fejl. Burde det ikke være muligt, at have en template refence i en vector
erklæring?

Min insert og find metode anvender det, og her giver det ingen problemer:
   const void insert(const Object& input){
      unsigned int position;
      position=hash(input);
      std::set<Object>& bucket=buckets[position];
      bucket.insert(input);
   }

   const bool find(const Object& input)const{
      unsigned int position;
      position=hash(input);
      const std::set<Object>& bucket=buckets[position];
      bool retVal = (bucket.find(input)!=bucket.end());
      return retVal;
   }

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Michael Rasmussen (15-09-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 15-09-05 22:00

On Thu, 15 Sep 2005 22:47:20 +0200, Michael Rasmussen wrote:

> Giver præcis samme fejl!
Fandt løsningen

vector< Object > gethashtable() {
std::vector< Object > result;
      
for(typename vector< set< Object > >::iterator i = buckets.begin();
buckets.end() != i; ++i)
{
   result.insert(result.end(), i->begin(), i->end());
}
return result;      
}

Hvorfor skal man explicit angive typename? Er det en ny sprogkonstruktion?

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Bertel Brander (15-09-2005)
Kommentar
Fra : Bertel Brander


Dato : 15-09-05 23:00

Michael Rasmussen wrote:
> Hvorfor skal man explicit angive typename?

Fordi det er det korrekte ifølge C++ standarden.

Er det en ny sprogkonstruktion?

Nej, men det er nyt at g++ forlanger det,
såvidt jeg ved et sted mellem version 3.2 og 3.4.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Bertel Brander (15-09-2005)
Kommentar
Fra : Bertel Brander


Dato : 15-09-05 23:07

Bertel Brander wrote:
> Michael Rasmussen wrote:
>
>> Hvorfor skal man explicit angive typename?
>
>
> Fordi det er det korrekte ifølge C++ standarden.

Se f.ex:
http://www.gamedev.net/community/forums/topic.asp?topic_id=317456

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Michael Rasmussen (15-09-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 15-09-05 23:38

On Fri, 16 Sep 2005 00:00:27 +0200, Bertel Brander wrote:

> Er det en ny sprogkonstruktion?
>
> Nej, men det er nyt at g++ forlanger det, såvidt jeg ved et sted mellem
> version 3.2 og 3.4.
Fandt C++ biblen frem:
En function template skal have class eller typename før en formel type. I
mit tilfælde var metoden ikke eksplicit en function template, men
konstruktionen "vector< set< Object > >::iterator i" definere i som en
formel type at typen vector< set< Object > >::iterator, hvorfor metoden
implicit konverteres til en function template.

--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste