I want to pass in my own hash functor and comparator to an unordered_set initialization. It fails compilation on g++ 4.2.1, boost version 1.42. It's not clear why, since a similar initialization of an STL set container seems to work fine... see below for the code and compilation failure. Any insight would be highly appreciated.
#include <set>
#include
class foo_compare {
public:
foo_compare(bool is_gt) : m_is_gt(is_gt) {}
bool operator() (int a, int b)
{
if (m_is_gt)
return a > b;
else
return a < b;
}
bool m_is_gt;
};
class foo_hash1
{
public:
foo_hash1() {}
~foo_hash1() {}
size_t operator() (int val) const
{
return val % 19;
}
};
using namespace std;
typedef set MySetT;
typedef std::tr1::unordered_set MyUnorderedSetT;
size_t hash_func_1(int val) {
return val % 19;
}
class Foo {
public:
Foo(bool is_gt) :
m_set(foo_compare(is_gt)), // this initialization is OK
m_unordered_set(foo_hash1() , // this one fails compilation! why ?
foo_compare(is_gt))
{}
MySetT m_set;
MyUnorderedSetT m_unordered_set;
};
int main()
{
bool is_greater_than = true;
Foo myfoo(is_greater_than);
return 0;
}
g++ my_unordered.cpp -I ~/temp/boost_1_42_0
my_unordered.cpp: In constructor Foo::Foo(bool)â:
my_unordered.cpp:43: error: no matching function for call to âboost::unordered_set::unordered_set(foo_hash1, foo_compare)â
/home/asinha/temp/boost_1_42_0/boost/unordered/unordered_set.hpp:175: note: candidates are: boost::unordered_set::unordered_set(boost::unordered_detail::move_from >) [with T = int, H = foo_hash1, P = foo_compare, A = std::allocator<int>]
/home/asinha/temp/boost_1_42_0/boost/unordered/unordered_set.hpp:121: note: boost::unordered_set::unordered_set(const boost::unordered_set&, const A&) [with T = int, H = foo_hash1, P = foo_compare, A = std::allocator<int>]
/home/asinha/temp/boost_1_42_0/boost/unordered/unordered_set.hpp:115: note: boost::unordered_set::unordered_set(const A&) [with T = int, H = foo_hash1, P = foo_compare, A = std::allocator<int>]
/home/asinha/temp/boost_1_42_0/boost/unordered/unordered_set.hpp:110: note: boost::unordered_set::unordered_set(size_t, const H&, const P&, const A&) [with T = int, H = foo_hash1, P = foo_compare, A = std::allocator<int>]
/home/asinha/temp/boost_1_42_0/boost/unordered/unordered_set.hpp:43: note: boost::unordered_set::unordered_set(const boost::unordered_set&)
Aman Sinha