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 <boost/tr1/unordered_set.hpp>

 

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<int, foo_compare> MySetT;

typedef std::tr1::unordered_set<int, foo_hash1, foo_compare> 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<int, foo_hash1, foo_compare, std::allocator<int> >::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<T, H, P, A>::unordered_set(boost::unordered_detail::move_from<boost::unordered_set<T, H, P, 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:121: note:                 boost::unordered_set<T, H, P, A>::unordered_set(const boost::unordered_set<T, H, P, A>&, 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<T, H, P, A>::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<T, H, P, A>::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<int, foo_hash1, foo_compare, std::allocator<int> >::unordered_set(const boost::unordered_set<int, foo_hash1, foo_compare, std::allocator<int> >&)

 

Aman Sinha