[英]Clang 3.0 C++ std::map<>::iterator compilation error
我有以下代碼:
template<typename T>
T* Factory<T>::GetObject(const char* type)
{
StringID typeID(type);
map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
return it->second();
}
它可以在Visual Studio 2010和2008上很好地編譯,但是不能在Clang 3.0(Xcode)上編譯。 我認為它在GCC上可以很好地編譯,但是我不確定它的格式是否與現在相同。 錯誤“;表達式后預期”在此行上:
map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
你知道為什么嗎?
VC ++接受你的代碼錯誤-一個符合的編譯器應該在這里給你一個錯誤。
map<StringID, T* (*)()>
使用T
,它是一個依賴類型; 因此,要訪問map<StringID, T* (*)()>
內部的類型map<StringID, T* (*)()>
例如iterator
,您需要使用typename
關鍵字來消除編譯器的歧義:
typename map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
有關更多說明,請參見此FAQ: 模板typename
關鍵字是做什么用的?
請注意,如果您在C ++ 11模式下進行編譯,則可以使用以下簡化方式:
auto it = m_createFunctions.find(typeID);
您很可能也會在GCC中出錯。 在這種情況下,必須使用“類型名”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.