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