簡體   English   中英

Clang 3.0 C ++ std :: map <> :: iterator編譯錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM