J'ai créé une classe de hachage pour un type personnalisé que j'utilise, mais il a un constructeur qui prend un argument. Je ne peux pas comprendre la syntaxe à utiliser dans un unordered_set.Syntaxe pour passer l'argument à la fonction de hachage unordered_set en C++
class Hasher {
unsigned arg;
public:
Hasher(unsigned a) : arg(a) {}
size_t operator()(const MyType& t) const {
return calculate_hash(arg, t);
}
}
int main() {
unordered_set<MyType, Hasher(2)> myset; // compilation error
}
Le message d'erreur:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:29: error: template argument for template type parameter must be a type
unordered_set<TetraFace,FaceHasher(2)> faces2;
^~~~~~~~~~~~~
/bin/../lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/unordered_set.h:90:11: note: template parameter is declared here
class _Hash = hash<_Value>,
^
J'ai aussi essayé
unordered_set<MyType, Hasher> myset(Hasher(2));
mais je reçois encore une erreur:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:59: error: expected ')'
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
./Triangulation.h:52:58: note: to match this '('
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
Oui, calculate_hash était juste un exemple pour montrer que j'ai besoin d'utiliser arg. Juste pour être sûr, vous avez dit unordered_map, mais il en va de même pour unordered_set, n'est-ce pas? – devil0150
En outre, si je spécifie un nombre de segments initial, est-ce que C++ le gère en cas de besoin, ou dois-je le faire moi-même? – devil0150
@ devil0150 Oups. C'est pareil pour un 'set'. Juste mis à jour la réponse. – NathanOliver