2015-10-31 105 views
2

更新我的文件到boost_1.59.0後,我得到一個ambyguous錯誤。我不明白什麼是錯的,因爲在1.43所有的工作都很好。Boost 1.59編譯錯誤

這是我的助推聲明和我的功能。

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)); 
    } 

我也試圖與auto C++ 11

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

什麼是* VID *?它看起來像是遺漏了一個* hash *函數來用作地圖中的一個鍵。有關更多詳細信息,請參見http://en.cppreference.com/w/cpp/utility/hash。 – skypjack

+0

VID是玩家姓名(ID)。我正在開發一款在線遊戲MMORPG。編輯的問題。看看vid.h – Scar

回答

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 s到幾個unsigned int S和使用它們利用std::hash<unsigned int>獲得哈希(我假設是從Windows API是在DWORD,據我所知,這是一個32位無符號整數)。

正如評論中所述,有關詳細信息,請參閱here