Connecting Tech Pros Worldwide Forums | Help | Site Map

error with tr1 unordered_map iterator

Rares Vernica
Guest
 
Posts: n/a
#1: Feb 24 '07
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, unsignedStringHash;
....
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::pair<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, unsignedStringHash;
....
typedef set<unsignedWordLevelEntrySet;
typedef pair<StringHash::const_iterator, WordLevelEntrySetWordLevelEntry;

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::pair<const std::basic_string<char, std::char_traits<char>,
std::allocator<char, unsigned int>,
Internal::extract1st<std::pair<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

Piyo
Guest
 
Posts: n/a
#2: Feb 25 '07

re: error with tr1 unordered_map iterator


Rares Vernica wrote:
Quote:
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, unsignedStringHash;
...
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::pair<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, unsignedStringHash;
...
typedef set<unsignedWordLevelEntrySet;
typedef pair<StringHash::const_iterator, WordLevelEntrySetWordLevelEntry;
>
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::pair<const std::basic_string<char, std::char_traits<char>,
std::allocator<char, unsigned int>,
Internal::extract1st<std::pair<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
Piyo
Guest
 
Posts: n/a
#3: Feb 27 '07

re: error with tr1 unordered_map iterator


Rares Vernica wrote:
Quote:
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, unsignedStringHash;
...
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::pair<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, unsignedStringHash;
...
typedef set<unsignedWordLevelEntrySet;
typedef pair<StringHash::const_iterator, WordLevelEntrySetWordLevelEntry;
>
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::pair<const std::basic_string<char, std::char_traits<char>,
std::allocator<char, unsigned int>,
Internal::extract1st<std::pair<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, unsignedStringHash;

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

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

}
Rares Vernica
Guest
 
Posts: n/a
#4: Feb 27 '07

re: error with tr1 unordered_map iterator


Piyo wrote:
Quote:
Rares Vernica wrote:
Quote:
>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, unsignedStringHash;
>...
>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::pair<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, unsignedStringHash;
>...
>typedef set<unsignedWordLevelEntrySet;
>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>
Quote:
>, std::pair<const std::basic_string<char, std::char_traits<char>,
>std::allocator<char, unsigned int>,
>Internal::extract1st<std::pair<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, unsignedStringHash;
>
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

Emmanuel Deloget
Guest
 
Posts: n/a
#5: Feb 28 '07

re: error with tr1 unordered_map iterator


On 28 fév, 00:07, Rares Vernica <rvern...@gmail.comwrote:
Quote:
Piyo wrote:
Quote:
Rares Vernica wrote:
Quote:
Hi,
>
Quote:
Quote:
I am using tr1/unordered_map in my code.
>
Quote:
Quote:
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).
>
Quote:
Quote:
I get a messy error. Here are what I try to do:
>
Quote:
Quote:
typedef unordered_map<string, unsignedStringHash;
...
StringHash::const_iterator word_pos;
>
Quote:
Quote:
I get the error when I create the const_iterator:
>
Quote:
Quote:
index.cc:161: error: no matching function for call to
'Internal::hashtable_iterator<std::pair<const std::basic_string<char,
std::char_traits<char>, std::allocator<char, unsigned int>, true,
false>::hashtable_iterator()'
>
Quote:
Quote:
Removing const from the iterator does not make any difference.
>
Quote:
Quote:
I tried to add const to string:
>
Quote:
Quote:
typedef unordered_map<const string, unsignedStringHash;
...
typedef set<unsignedWordLevelEntrySet;
typedef pair<StringHash::const_iterator, WordLevelEntrySet>
WordLevelEntry;
>
Quote:
Quote:
And the error moves to another place but is also on const_iterator:
>
Quote:
Quote:
/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::pair<const std::basic_string<char, std::char_traits<char>,
std::allocator<char, unsigned int>,
Internal::extract1st<std::pair<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>':
>
Quote:
Quote:
Is probably something that has been fixed or improved between the
versions. Is there any workaround?
>
Quote:
Quote:
Thanks a lot,
Ray
>
Quote:
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.
>
Quote:
--------------------------------------------------------
#include <tr1/unordered_map>
#include <string>
>
Quote:
using namespace std;
using namespace std::tr1;
typedef unordered_map<string, unsignedStringHash;
>
Quote:
int
main()
{
StringHash myHashTable;
// assume you added some stuff in it
>
Quote:
StringHash::const_iterator iter( myHashTable.begin() );
>
Quote:
}
>
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

Rares Vernica
Guest
 
Posts: n/a
#6: Feb 28 '07

re: error with tr1 unordered_map iterator


Emmanuel Deloget wrote:
Quote:
On 28 fév, 00:07, Rares Vernica <rvern...@gmail.comwrote:
Quote:
>Piyo wrote:
Quote:
>>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, unsignedStringHash;
>>>...
>>>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::pair<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, unsignedStringHash;
>>>...
>>>typedef set<unsignedWordLevelEntrySet;
>>>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::pair<const std::basic_string<char, std::char_traits<char>,
>>>std::allocator<char, unsigned int>,
>>>Internal::extract1st<std::pair<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, unsignedStringHash;
>>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
Piyo
Guest
 
Posts: n/a
#7: Feb 28 '07

re: error with tr1 unordered_map iterator


Rares Vernica wrote:
Quote:
>
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?
Quote:
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() );
Closed Thread


Similar C / C++ bytes