Специализация хэша std ::для вложенного класса в классе-шаблоне

У меня есть класс-шаблон Baz, который содержит вложенный класс Sub. Я хотел бы определить хэш-функцию для этого подкласса, специализируясь на std ::hash. Однако, похоже, это не работает.

#include <functional>

struct Foo {
    struct Sub {
    };
};

template <class T>
struct Bar {
};

template <class T>
struct Baz {
    struct Sub {
        int x;
    };
};

// declare hash for Foo::Sub - all right
namespace std {
    template <>
    struct hash< Foo::Sub >;
}

// declare hash for Bar<T> - all right
namespace std {
    template <class T>
    struct hash< Bar<T> >;
}

// declare hash function for Baz<T>::Sub - doesn't work!
namespace std {
    template <class T>
    struct hash< Baz<T>::Sub >;
}

// Adding typename produces a different error.
namespace std {
    template <class T>
    struct hash< typename Baz<T>::Sub >;
}

Gcc 4.5.3 жалуется:

$ g++ -std=c++0x -c hash.cpp
hash.cpp:34:30: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp> struct std::hash’
hash.cpp:34:30: error:   expected a type, got ‘Baz<T>::Sub’
hash.cpp:40:12: error: template parameters not used in partial specialization:
hash.cpp:40:12: error:         ‘T’

ОБНОВЛЕНИЕ

На самом деле я пытаюсь реализовать контейнер, который поддерживает стабильные ссылки(не в смысле C++ )на элементы внутри него. Я хочу разрешить пользователю вставлять эти ссылки в std::unordered_setи подобные, и использовать их для эффективного доступа или изменения существующих элементов. Ниже приведен макет, а не конкретный контейнер, который я реализую. Проблема заключается в определении хеш-функции для ссылочного типа.

template <class T>
class Container {
public:
    class Reference {
    public:
        // operator==, operator!=, operator<...., isNull()
    private:
        size_t index; // index into m_entries (or could be anything else)
        // possibly more stuff
    };

    Reference insert (const T &value);
    Reference find (const T &value);
    void remove (Reference r);
    Reference first ();
    Reference next (Reference prev);

private:
    struct Entry { T value,... };

    std::vector<Entry> m_entries;
};
5
задан Marc Mutz - mmutz 30 April 2015 в 13:48
поделиться