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。谢谢你的回答,这是一个可怕的类型键入抱歉不止一次。为什么不在你的类中键入地图并使用它呢?@无用:我链接的常见问题解答正好提出了这一点。:-]