我有这个代码:
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 上编译得很好,但我不确定它是否与现在的形式相同。错误“; expressed after expression”在这一行:
map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
你知道为什么吗?
最佳答案
VC++ 错误地接受了您的代码 — 符合标准的编译器应该在这里给您一个错误。
map<StringID, T* (*)()>
使用 T
,这是一个依赖类型;因此,访问 map<StringID, T* (*)()>
内部的类型例如 iterator
, 你需要使用 typename
为编译器消除歧义的关键字:
typename map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);
有关进一步说明,请参阅此常见问题解答:What is the template typename
keyword used for?
请注意,如果您在 C++11 模式下编译,则可以改用以下简化:
auto it = m_createFunctions.find(typeID);
关于c++ - Clang 3.0 C++ std::map<>::iterator 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117483/