我现在正在项目中使用 Boost 的哈希映射实现,并且我正在尝试实现键的自定义类型。我有四个无符号整数,我想将它们组合成一个 128 位数据类型以用作密钥。
我创建了一个包含四个元素的 32 位整数数组的结构,用作我的存储。老实说,我不确定Boost的哈希图是如何工作的,所以我不确定我在这里做什么,但我遵循了Boost文档(http://www.boost.org/doc/libs/1_37_0/doc/html/hash/custom.html http://www.boost.org/doc/libs/1_37_0/doc/html/hash/custom.html)用于扩展 boost::hash,我创建了一个哈希函数以及一个自定义比较运算符。
我在标头中定义了此自定义类型。这是我的代码:
#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
现在,当我在 Boost 的无序映射中实际使用这种类型时,我的代码可以编译,但无法链接。链接器声称我在多个目标文件中多次定义了一个符号。我真的很想让我的 128 位类型与这张地图一起工作。关于我搞砸的事情有什么建议,或者更好的方法吗?
无序映射的参与几乎是您遇到的问题的偶然。真正的问题是你正在定义hash_value
and operator==
在包含上述标头的每个文件中。
您可以通过以下任一方法解决此问题:
- 将它们定义为内联函数
- 只需在标头中声明它们
如果您执行后者(这就是您通常想要的),您将把这些函数的定义移动到.cpp
文件(或任何用于 C++ 源文件的扩展名)。然后,您将编译该文件,并将生成的对象与使用 int128 类型的其他代码链接。
编辑:您仍然可以使比较更清晰,例如:
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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)