Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > error with tr1 unordered_map iterator

Reply
Thread Tools

error with tr1 unordered_map iterator

 
 
Rares Vernica
Guest
Posts: n/a
 
      02-24-2007
Hi,

I am using tr1/unordered_map in my code.

My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).

I get a messy error. Here are what I try to do:

typedef unordered_map<string, unsigned> StringHash;
....
StringHash::const_iterator word_pos;

I get the error when I create the const_iterator:

index.cc:161: error: no matching function for call to
‘Internal::hashtable_iterator<std:air<const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
false>::hashtable_iterator()’

Removing const from the iterator does not make any difference.

I tried to add const to string:

typedef unordered_map<const string, unsigned> StringHash;
....
typedef set<unsigned> WordLevelEntrySet;
typedef pair<StringHash::const_iterator, WordLevelEntrySet> WordLevelEntry;

And the error moves to another place but is also on const_iterator:

/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
In instantiation of ‘Internal::hash_code_base<const
std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
std:air<const std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, unsigned int>,
Internal::extract1st<std:air<const std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, unsigned int> >,
std::equal_to<const std::basic_string<char, std::char_traits<char>,
std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
std::char_traits<char>, std::allocator<char> > >,
Internal::mod_range_hashing, Internal::default_ranged_hash, false>’:

Is probably something that has been fixed or improved between the
versions. Is there any workaround?

Thanks a lot,
Ray
 
Reply With Quote
 
 
 
 
Piyo
Guest
Posts: n/a
 
      02-25-2007
Rares Vernica wrote:
> Hi,
>
> I am using tr1/unordered_map in my code.
>
> My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
> need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).
>
> I get a messy error. Here are what I try to do:
>
> typedef unordered_map<string, unsigned> StringHash;
> ...
> StringHash::const_iterator word_pos;
>
> I get the error when I create the const_iterator:
>
> index.cc:161: error: no matching function for call to
> ‘Internal::hashtable_iterator<std:air<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
> false>::hashtable_iterator()’
>
> Removing const from the iterator does not make any difference.
>
> I tried to add const to string:
>
> typedef unordered_map<const string, unsigned> StringHash;
> ...
> typedef set<unsigned> WordLevelEntrySet;
> typedef pair<StringHash::const_iterator, WordLevelEntrySet> WordLevelEntry;
>
> And the error moves to another place but is also on const_iterator:
>
> /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
> In instantiation of ‘Internal::hash_code_base<const
> std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
> std:air<const std::basic_string<char, std::char_traits<char>,
> std::allocator<char> >, unsigned int>,
> Internal::extract1st<std:air<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, unsigned int> >,
> std::equal_to<const std::basic_string<char, std::char_traits<char>,
> std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> > >,
> Internal::mod_range_hashing, Internal::default_ranged_hash, false>’:
>
> Is probably something that has been fixed or improved between the
> versions. Is there any workaround?
>
> Thanks a lot,
> Ray


I will need to check if I have the tr1 headers and see if I can
duplicate your errors since I am locked down on 4.0.1. It would
really suck if I cannot use them either. I'll get back to you on
this on Monday if you can wait BTW, do you know if G++ people
already puts the tr1 headers in the 4.0.1 dist?

As a workaround you can use ext/hash_map that the G++ folks provide.
Since it is not a widely accepted norm they namespaced it which
makes your code less portable

HTH
 
Reply With Quote
 
 
 
 
Piyo
Guest
Posts: n/a
 
      02-27-2007
Rares Vernica wrote:
> Hi,
>
> I am using tr1/unordered_map in my code.
>
> My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
> need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).
>
> I get a messy error. Here are what I try to do:
>
> typedef unordered_map<string, unsigned> StringHash;
> ...
> StringHash::const_iterator word_pos;
>
> I get the error when I create the const_iterator:
>
> index.cc:161: error: no matching function for call to
> ‘Internal::hashtable_iterator<std:air<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
> false>::hashtable_iterator()’
>
> Removing const from the iterator does not make any difference.
>
> I tried to add const to string:
>
> typedef unordered_map<const string, unsigned> StringHash;
> ...
> typedef set<unsigned> WordLevelEntrySet;
> typedef pair<StringHash::const_iterator, WordLevelEntrySet> WordLevelEntry;
>
> And the error moves to another place but is also on const_iterator:
>
> /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
> In instantiation of ‘Internal::hash_code_base<const
> std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
> std:air<const std::basic_string<char, std::char_traits<char>,
> std::allocator<char> >, unsigned int>,
> Internal::extract1st<std:air<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, unsigned int> >,
> std::equal_to<const std::basic_string<char, std::char_traits<char>,
> std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
> std::char_traits<char>, std::allocator<char> > >,
> Internal::mod_range_hashing, Internal::default_ranged_hash, false>’:
>
> Is probably something that has been fixed or improved between the
> versions. Is there any workaround?
>
> Thanks a lot,
> Ray


Woah this is way odd but based on my tests,
unordered_map::iterator has no default constructor.
This is what you seem to be encountering. I am not
sure if that is a bug on G++'s part or not or if
TR1 specifies that it need not be default constructible.


--------------------------------------------------------
#include <tr1/unordered_map>
#include <string>

using namespace std;
using namespace std::tr1;
typedef unordered_map<string, unsigned> StringHash;

int
main()
{
StringHash myHashTable;
// assume you added some stuff in it

StringHash::const_iterator iter( myHashTable.begin() );

}
 
Reply With Quote
 
Rares Vernica
Guest
Posts: n/a
 
      02-27-2007
Piyo wrote:
> Rares Vernica wrote:
>> Hi,
>>
>> I am using tr1/unordered_map in my code.
>>
>> My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
>> need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).
>>
>> I get a messy error. Here are what I try to do:
>>
>> typedef unordered_map<string, unsigned> StringHash;
>> ...
>> StringHash::const_iterator word_pos;
>>
>> I get the error when I create the const_iterator:
>>
>> index.cc:161: error: no matching function for call to
>> ‘Internal::hashtable_iterator<std:air<const std::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
>> false>::hashtable_iterator()’
>>
>> Removing const from the iterator does not make any difference.
>>
>> I tried to add const to string:
>>
>> typedef unordered_map<const string, unsigned> StringHash;
>> ...
>> typedef set<unsigned> WordLevelEntrySet;
>> typedef pair<StringHash::const_iterator, WordLevelEntrySet>
>> WordLevelEntry;
>>
>> And the error moves to another place but is also on const_iterator:
>>
>> /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
>> In instantiation of ‘Internal::hash_code_base<const
>> std::basic_string<char, std::char_traits<char>, std::allocator<char>
>> >, std:air<const std::basic_string<char, std::char_traits<char>,

>> std::allocator<char> >, unsigned int>,
>> Internal::extract1st<std:air<const std::basic_string<char,
>> std::char_traits<char>, std::allocator<char> >, unsigned int> >,
>> std::equal_to<const std::basic_string<char, std::char_traits<char>,
>> std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
>> std::char_traits<char>, std::allocator<char> > >,
>> Internal::mod_range_hashing, Internal::default_ranged_hash, false>’:
>>
>> Is probably something that has been fixed or improved between the
>> versions. Is there any workaround?
>>
>> Thanks a lot,
>> Ray

>
> Woah this is way odd but based on my tests,
> unordered_map::iterator has no default constructor.
> This is what you seem to be encountering. I am not
> sure if that is a bug on G++'s part or not or if
> TR1 specifies that it need not be default constructible.
>
>
> --------------------------------------------------------
> #include <tr1/unordered_map>
> #include <string>
>
> using namespace std;
> using namespace std::tr1;
> typedef unordered_map<string, unsigned> StringHash;
>
> int
> main()
> {
> StringHash myHashTable;
> // assume you added some stuff in it
>
> StringHash::const_iterator iter( myHashTable.begin() );
>
> }


Yes, it seems that the iterator does not have a default constructor.

I hope I am wrong.

Thanks,
Ray

 
Reply With Quote
 
Emmanuel Deloget
Guest
Posts: n/a
 
      02-28-2007
On 28 fév, 00:07, Rares Vernica <(E-Mail Removed)> wrote:
> Piyo wrote:
> > Rares Vernica wrote:
> >> Hi,

>
> >> I am using tr1/unordered_map in my code.

>
> >> My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
> >> need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).

>
> >> I get a messy error. Here are what I try to do:

>
> >> typedef unordered_map<string, unsigned> StringHash;
> >> ...
> >> StringHash::const_iterator word_pos;

>
> >> I get the error when I create the const_iterator:

>
> >> index.cc:161: error: no matching function for call to
> >> 'Internal::hashtable_iterator<std:air<const std::basic_string<char,
> >> std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
> >> false>::hashtable_iterator()'

>
> >> Removing const from the iterator does not make any difference.

>
> >> I tried to add const to string:

>
> >> typedef unordered_map<const string, unsigned> StringHash;
> >> ...
> >> typedef set<unsigned> WordLevelEntrySet;
> >> typedef pair<StringHash::const_iterator, WordLevelEntrySet>
> >> WordLevelEntry;

>
> >> And the error moves to another place but is also on const_iterator:

>
> >> /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
> >> In instantiation of 'Internal::hash_code_base<const
> >> std::basic_string<char, std::char_traits<char>, std::allocator<char>
> >> >, std:air<const std::basic_string<char, std::char_traits<char>,
> >> std::allocator<char> >, unsigned int>,
> >> Internal::extract1st<std:air<const std::basic_string<char,
> >> std::char_traits<char>, std::allocator<char> >, unsigned int> >,
> >> std::equal_to<const std::basic_string<char, std::char_traits<char>,
> >> std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
> >> std::char_traits<char>, std::allocator<char> > >,
> >> Internal::mod_range_hashing, Internal::default_ranged_hash, false>':

>
> >> Is probably something that has been fixed or improved between the
> >> versions. Is there any workaround?

>
> >> Thanks a lot,
> >> Ray

>
> > Woah this is way odd but based on my tests,
> > unordered_map::iterator has no default constructor.
> > This is what you seem to be encountering. I am not
> > sure if that is a bug on G++'s part or not or if
> > TR1 specifies that it need not be default constructible.

>
> > --------------------------------------------------------
> > #include <tr1/unordered_map>
> > #include <string>

>
> > using namespace std;
> > using namespace std::tr1;
> > typedef unordered_map<string, unsigned> StringHash;

>
> > int
> > main()
> > {
> > StringHash myHashTable;
> > // assume you added some stuff in it

>
> > StringHash::const_iterator iter( myHashTable.begin() );

>
> > }

>
> Yes, it seems that the iterator does not have a default constructor.
>
> I hope I am wrong.
>
> Thanks,
> Ray


The TR1 only states that the unordered_map iterators are "of at least
the forward iterator category", so I guess they have to respect the
standard requirements (which in this case means that they should have
a default constructor, as per table 74 (§24.1.3)). I'd consider this
to be a bug in the TR1 implementation that comes with g++ (but that's
not like this implementation was complete) - unless I misundertood
something.

Regards,

-- Emmanuel Deloget

 
Reply With Quote
 
Rares Vernica
Guest
Posts: n/a
 
      02-28-2007
Emmanuel Deloget wrote:
> On 28 fév, 00:07, Rares Vernica <(E-Mail Removed)> wrote:
>> Piyo wrote:
>>> Rares Vernica wrote:
>>>> Hi,
>>>> I am using tr1/unordered_map in my code.
>>>> My code compiled ok on g++ (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu1). Now I
>>>> need to compile my code on g++ (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5).
>>>> I get a messy error. Here are what I try to do:
>>>> typedef unordered_map<string, unsigned> StringHash;
>>>> ...
>>>> StringHash::const_iterator word_pos;
>>>> I get the error when I create the const_iterator:
>>>> index.cc:161: error: no matching function for call to
>>>> 'Internal::hashtable_iterator<std:air<const std::basic_string<char,
>>>> std::char_traits<char>, std::allocator<char> >, unsigned int>, true,
>>>> false>::hashtable_iterator()'
>>>> Removing const from the iterator does not make any difference.
>>>> I tried to add const to string:
>>>> typedef unordered_map<const string, unsigned> StringHash;
>>>> ...
>>>> typedef set<unsigned> WordLevelEntrySet;
>>>> typedef pair<StringHash::const_iterator, WordLevelEntrySet>
>>>> WordLevelEntry;
>>>> And the error moves to another place but is also on const_iterator:
>>>> /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/tr1/hashtable:
>>>> In instantiation of 'Internal::hash_code_base<const
>>>> std::basic_string<char, std::char_traits<char>, std::allocator<char>
>>>>> , std:air<const std::basic_string<char, std::char_traits<char>,
>>>> std::allocator<char> >, unsigned int>,
>>>> Internal::extract1st<std:air<const std::basic_string<char,
>>>> std::char_traits<char>, std::allocator<char> >, unsigned int> >,
>>>> std::equal_to<const std::basic_string<char, std::char_traits<char>,
>>>> std::allocator<char> > >, std::tr1::hash<const std::basic_string<char,
>>>> std::char_traits<char>, std::allocator<char> > >,
>>>> Internal::mod_range_hashing, Internal::default_ranged_hash, false>':
>>>> Is probably something that has been fixed or improved between the
>>>> versions. Is there any workaround?
>>>> Thanks a lot,
>>>> Ray
>>> Woah this is way odd but based on my tests,
>>> unordered_map::iterator has no default constructor.
>>> This is what you seem to be encountering. I am not
>>> sure if that is a bug on G++'s part or not or if
>>> TR1 specifies that it need not be default constructible.
>>> --------------------------------------------------------
>>> #include <tr1/unordered_map>
>>> #include <string>
>>> using namespace std;
>>> using namespace std::tr1;
>>> typedef unordered_map<string, unsigned> StringHash;
>>> int
>>> main()
>>> {
>>> StringHash myHashTable;
>>> // assume you added some stuff in it
>>> StringHash::const_iterator iter( myHashTable.begin() );
>>> }

>> Yes, it seems that the iterator does not have a default constructor.
>>
>> I hope I am wrong.
>>
>> Thanks,
>> Ray

>
> The TR1 only states that the unordered_map iterators are "of at least
> the forward iterator category", so I guess they have to respect the
> standard requirements (which in this case means that they should have
> a default constructor, as per table 74 (§24.1.3)). I'd consider this
> to be a bug in the TR1 implementation that comes with g++ (but that's
> not like this implementation was complete) - unless I misundertood
> something.
>
> Regards,
>
> -- Emmanuel Deloget
>


If it is a bug then this bug appears in g++ (GCC) 4.0.3 (Ubuntu
4.0.3-1ubuntu5) and was fixed on or before g++ (GCC) 4.1.2 (Ubuntu
4.1.2-0ubuntu1).

Any workarounds for this bug?

Thanks a lot,
Ray
 
Reply With Quote
 
Piyo
Guest
Posts: n/a
 
      02-28-2007
Rares Vernica wrote:
>
> If it is a bug then this bug appears in g++ (GCC) 4.0.3 (Ubuntu

I used 4.0.2 to diagnose this bug. So I think it even appears earlier.
Maybe even since the inception of the 4 series?

> 4.0.3-1ubuntu5) and was fixed on or before g++ (GCC) 4.1.2 (Ubuntu
> 4.1.2-0ubuntu1).
>
> Any workarounds for this bug?
>

- upgrade to 4.1.2
- use ext/hash_map
- use dynamic allocation of iterators ie. "new" your iterator
and make sure to use std::tr1::shared_ptr!!
- always construct your iterators with stuff?
eg. unordered_map::iterator iter( foo.begin() );
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
high traffic/availability application and gnu_cxx::hash_map problem -better to use tr1/unordered_map et al? Alex Wanderleit C++ 1 01-05-2011 12:06 PM
g++4.3.2 w/ c++0x: error: no type named ‘iterator’ in ‘class std::unordered_map<...' Samuel.Hornus@gmail.com C++ 3 11-23-2008 04:01 PM
iterator as key for unordered_map abir C++ 6 06-26-2008 09:59 PM
std::tr1::array iterator types Fokko Beekhof C++ 1 04-07-2008 05:00 PM
Continuing my foray into the TR1: tr1::shared_ptr<> Emmanuel Deloget C++ 3 03-03-2007 03:11 PM



Advertisments