By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,898 Members | 2,006 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,898 IT Pros & Developers. It's quick & easy.

error with tr1 unordered_map iterator

P: n/a
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
Feb 24 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
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, 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
Feb 25 '07 #2

P: n/a
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, 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() );

}
Feb 27 '07 #3

P: n/a
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, 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

Feb 27 '07 #4

P: n/a
On 28 fév, 00:07, Rares Vernica <rvern...@gmail.comwrote:
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, 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

Feb 28 '07 #5

P: n/a
Emmanuel Deloget wrote:
On 28 fév, 00:07, Rares Vernica <rvern...@gmail.comwrote:
>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, 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
Feb 28 '07 #6

P: n/a
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() );
Feb 28 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.