C++ - вызов метода из шаблона класса

В настоящее время у меня проблема с шаблоном класса в C++. В настоящее время я делаю хеш-таблицу.

Я использую функтор в качестве шаблона класса, чтобы указать мою хеш-функцию для каждого экземпляра таблицы.

IE: одна таблица имеет целые числа для своих ключей, строки для своих значений. Другой может иметь строки для своих ключей и целые числа для своих значений и т. д.

class HashString
{
    public:
       unsigned long operator()(std::string& key, const unsigned int tableSize)
       {
           // .....
       }

};

template<typename keyType, typename valueType, class HashFunctor>
class HashTable
{
    public:
        // ....

    private:

        HashFunctor myHash;

};

И теперь, допустим, я хочу вызвать метод под названием «myHash» для хеширования ключа, я бы сначала назвал его, выполнив:

myHash(key, table.size())

Но, например, gcc не находит перегрузку функции для HashFuntor (string, unsigned int).

Может ли кто-нибудь сказать мне, как я могу позвонить в myHash? (Примечание: я не хотел бы менять свою структуру функторов)

изменить: это сообщение об ошибке, которое я получаю от моего фактического решения

  instantiated from ‘void tp3::Table<TypeClef, TypeDonnee, FoncHachage>::insert(const TypeClef&, const TypeDonnee&) [with TypeClef = int, TypeDonnee = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, FoncHachage = tp3::HacheString]’

no match for call to ‘(tp3::HacheString) (tp3::Table<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, tp3::HacheString>::HashEntry&)’

Изменить: везде написано, что HacheString на самом деле является HashString (я перевел свой код, чтобы вставить его сюда).


person Pacane    schedule 01.12.2010    source источник
comment
Можете ли вы опубликовать фактическую ошибку и соответствующий код?   -  person Alex Budovski    schedule 01.12.2010
comment
@Alex Алекс Я загрузил одно из сообщений об ошибках. Хотя они все упоминают одно и то же (потому что мне звонят)   -  person Pacane    schedule 01.12.2010
comment
boost::unordered_map, похоже, то, что вам нужно (вы можете получить к нему доступ как std::tr1::unordered_map или даже std::unordered_map в C++0x). Пожалуйста, не изобретайте велосипед.   -  person Karl Knechtel    schedule 01.12.2010
comment
@Karl Knechtel это только для образовательных целей.   -  person Pacane    schedule 01.12.2010


Ответы (1)


operator() в HashString является закрытым и, вероятно, не является корректным. Это должна быть константная функция-член, принимающая const std::string& в качестве первого параметра. Второй параметр не обязательно должен быть константным.

Кажется, вы вызываете его с HashEntry в качестве второго параметра. Что такое HashEntry? Требуется целое без знака!

Возможно, это уже решит некоторые ваши проблемы.

Я предполагаю, что ваша разница HacheString / HashString - это просто опечатка.

person CashCow    schedule 01.12.2010
comment
На самом деле это общедоступно, просто ошибка при перепечатывании, и да, определенно опечатка для хэш/хэш (опечатка перевода с французского на английский) - person Pacane; 01.12.2010
comment
По сути, HashEntry — это узел ключ/значение. Я пытаюсь получить позицию таблицы, где hashEntry должен быть вставлен в таблицу, путем хеширования ее ключа. - person Pacane; 01.12.2010