c++ - Clang 3.0 C++ std::map<>::iterator 编译错误

标签 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();
}

它在 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/

相关文章:

c++ - 为什么我们在使用赋值运算符时要使用 copy-and-swap ?

c++ - 如何覆盖当前文件?

c++ - clang 与 gcc 运行时差异 : c++ class template built w clang crashes w/o copy constructor, 使用复制构造函数构建 gcc 崩溃

c++ - 奇怪的模板行为

xcode - 如何静态分析C++和Objective-C++代码?

c - Clang 中的 256 位算术(扩展整数)

c++ - 如果 <iostream> 函数失败会怎样?

c++ - 在 linux 上链接 clang/llvm 库总是失败

javascript - 为什么 jade 忽略\n 和空格?

javascript - javascript模板和事件处理