将我的文件更新为boost_1.59.0
后,我遇到了一个很大的错误。我无法理解错误是什么,因为在提升1.43中,所有工作都很好。
这是我的提升声明和我的功能。
boost::unordered_map<VID, size_t>::iterator iterTargetMap = rSkillUseInfo.TargetVIDMap.find(TargetVID);
if (rSkillUseInfo.TargetVIDMap.end() != iterTargetMap)
{
size_t MaxAttackCountPerTarget = 1;
switch (SkillID)
{
case SKILL_SAMYEON:
case SKILL_CHARYUN:
MaxAttackCountPerTarget = 3;
break;
}
if (iterTargetMap->second >= MaxAttackCountPerTarget)
{
sys_log(0, "SkillHack: Too Many Hit count from SkillID(%u) count(%u)", SkillID, iterTargetMap->second);
return false;
}
iterTargetMap->second++;
}
else
{
rSkillUseInfo.TargetVIDMap.insert( std::make_pair(TargetVID, 1) );
}
我也试过c ++ 11中的auto
auto iterator iterTargetMap = rSkillUseInfo.TargetVIDMap.find(TargetVID);
这是我的错误日志gcc49 http://pastebin.com/p1KLqs9H 我无法在这里写错误太大了。
我被困4天这个错误。 :(
这是vid.h
class VID
{
public:
VID() : m_id(0), m_crc(0)
{
}
VID(DWORD id, DWORD crc)
{
m_id = id;
m_crc = crc;
}
VID(const VID &rvid)
{
*this = rvid;
}
const VID & operator = (const VID & rhs)
{
m_id = rhs.m_id;
m_crc = rhs.m_crc;
return *this;
}
bool operator == (const VID & rhs) const
{
return (m_id == rhs.m_id) && (m_crc == rhs.m_crc);
}
bool operator != (const VID & rhs) const
{
return !(*this == rhs);
}
operator DWORD() const
{
return m_id;
}
void Reset()
{
m_id = 0, m_crc = 0;
}
private:
DWORD m_id;
DWORD m_crc;
};
答案 0 :(得分:2)
通过查看错误,您似乎必须为 VID 类型定义哈希函数,才能将其用作地图中的键。
标准哈希函数已在STL中为基本类型定义,但您必须为自己定义域类型的特定哈希函数。
通常,做这样的事情就足够了:
namespace std {
template<> struct hash<VID> {
using argument_type = VID;
using result_type = std::size_t;
result_type operator()(argument_type const& vid) const {
// what to put here depends on the type of VID
// and how you want to create the hash
}
};
}
困难通常在于理解如何创建哈希。根据我的经验,对于用户定义的类,我曾经使用过一些数据成员的标准专业化,这是最重要的成员。
在您的情况下,作为示例,您可以将DWORD
转换为几个unsigned int
并使用它们来使用std::hash<unsigned int>
来获取哈希值(我假设这就是Windows API中的 DWORD ,就我记忆而言,这是一个32位无符号整数。)
正如评论中已经说明的那样,请参阅here了解更多详情。