Question

J'utilise la mise en œuvre de Boost d'une carte de hachage dans un projet en ce moment, et je suis en train de mettre en œuvre un type personnalisé pour les clés. J'ai quatre entiers non signés que je voudrais combiner en un seul type de données 128 bits à utiliser comme clé.

J'ai créé un struct avec un tableau d'entiers 32 bits de quatre éléments, qui me sert de stockage. Pour être honnête, je ne sais pas comment la carte de hachage de Boost fonctionne, donc je ne suis pas sûr de ce que je fais ici, mais je suivais la documentation Boost ( http://www.boost.org/doc/libs/1_37_0/doc/html/hash/custom.html ) pour l'extension de hachage de boost, et je créé une fonction de hachage, ainsi qu'un opérateur de comparaison personnalisée.

J'ai ce type personnalisé défini dans un en-tête. Ceci est mon code:

#ifndef INT128_H_
#define INT128_H_

// Custom 128-bit datatype used to store and compare the results of a weakened hash operation.
struct int128
{
    unsigned int storage[4];

    /* Assignment operation that takes a 32-bit integer array of four elements.
    This makes assignment of values a shorter and less painful operation. */
    void operator=(const unsigned int input[4])
    {
        for(int i = 0; i < 4; i++)
            storage[i] = input[i];
    }
};

bool operator==(int128 const &o1, int128 const &o2)
{
    if(o1.storage[0] == o2.storage[0] && o1.storage[1] == o2.storage[1] && 
       o1.storage[2] == o2.storage[2] && o1.storage[3] == o2.storage[3])
        return true;

    return false;
}

// Hash function to make int128 work with boost::hash.
std::size_t hash_value(int128 const &input)
{
    boost::hash<unsigned long long> hasher;
    unsigned long long hashVal = input.storage[0];

    for(int i = 1; i < 3; i++)
    {
        hashVal *= 37;
        hashVal += input.storage[1];
    }

    return hasher(hashVal);
}

#endif

Maintenant, quand je l'utilise réellement ce type sur la carte Boost non ordonnée, mon code compile, mais ne parvient pas à créer un lien. L'éditeur de liens prétend que j'ai un symbole défini plusieurs fois dans plusieurs fichiers d'objets. Je voudrais vraiment obtenir mon type 128 bits travaillant avec cette carte. Des conseils sur ce que je suis vissage, ou une meilleure façon de le faire?

Était-ce utile?

La solution

L'implication des-carte est non ordonnée presque accessoire au problème que vous rencontrez. Le vrai problème est que vous définissez hash_value et operator== dans chaque fichier qui comprend l'en-tête ci-dessus.

Vous pouvez guérir ce soit:

  1. définir à la fois comme les fonctions en ligne
  2. Il suffit de les déclarer dans l'en-tête

Si vous faites ce dernier (et c'est ce que vous voulez généralement vous), vous déplacerez les définitions de ces fonctions dans un fichier .cpp (ou tout autre extension que vous utilisez pour les fichiers source C ++). Vous pourrez ensuite compiler ce fichier, et le lien avec l'objet résultant de votre autre code qui utilise le type de int128.

Edit: Vous pouvez toujours faire votre propre comparaison, quelque chose comme:

bool operator==(int128 const &o1, int128 const &o2)
{
    return o1.storage[0] == o2.storage[0] && o1.storage[1] == o2.storage[1] && 
           o1.storage[2] == o2.storage[2] && o1.storage[3] == o2.storage[3]);
}

Autres conseils

  

L'éditeur de liens prétend que j'ai un symbole   définis à plusieurs reprises dans plusieurs   fichiers objet.

déclarer vos fonctions inline

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top