C ++ - вызов метода из шаблона класса - PullRequest
2 голосов
/ 01 декабря 2010

У меня сейчас проблема с шаблоном класса в 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?(Примечание: я не хотел бы изменять свою структуру функторов)

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

  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 (я перевел свой код, чтобы вставить его сюда).

1 Ответ

2 голосов
/ 01 декабря 2010

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

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

Это может уже решить некоторые ваши проблемы.

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

...