CLANG 3 C++ STD::MAP>::迭代器编译错误

CLANG 3 C++ STD::MAP>::迭代器编译错误,c++,templates,clang,C++,Templates,Clang,我有以下代码: 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(); } 它在VisualStudio2010和2008上编

我有以下代码:

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();
}
它在VisualStudio2010和2008上编译良好,但在Clang3.0Xcode上编译不好。我认为它在GCC上编译得很好,但我不确定它是否与现在的格式相同。误差;应在表达式位于此行之后:

map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);

你知道为什么吗?

VC++错误地接受了你的代码-一个一致的编译器应该在这里给你一个错误

map使用T,它是一个依赖类型;因此,要访问映射内部的类型(如迭代器),需要使用typename关键字为编译器消除歧义:

typename map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);

VC++错误地接受了您的代码-一致性编译器应该在这里给您一个错误

map使用T,它是一个依赖类型;因此,要访问映射内部的类型(如迭代器),需要使用typename关键字为编译器消除歧义:

typename map<StringID, T* (*)()>::iterator it = m_createFunctions.find(typeID);

您很可能在GCC中也会出现错误。”在这种情况下,“Typename”是必需的。

您很可能在GCC中也会出现错误在这种情况下,“类型名称”是必需的。

LLVM?你是说叮当声吗?LLVM?你是说叮当声吗?我不想用自动兼容。谢谢你的回答,这是一个可怕的类型键入抱歉不止一次。为什么不在你的类中键入地图并使用它呢?@无用:我链接的常见问题解答正好提出了这一点。:-]我不想为了兼容性而使用auto。谢谢你的回答,这是一个可怕的类型键入抱歉不止一次。为什么不在你的类中键入地图并使用它呢?@无用:我链接的常见问题解答正好提出了这一点。:-]