【问题标题】:Clang 3.0 C++ std::map<>::iterator compilation errorClang 3.0 C++ std::map<>::iterator 编译错误
【发布时间】:2012-02-02 18:03:27
【问题描述】:

我有这个代码:

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);

你知道为什么吗?

【问题讨论】:

  • LLVM?你是说 Clang 吗?

标签: c++ templates clang


【解决方案1】:

VC++ 错误地接受你的代码——一个符合标准的编译器应该在这里给你一个错误。

map&lt;StringID, T* (*)()&gt;使用T,这是一个依赖类型;因此,要访问map&lt;StringID, T* (*)()&gt; 内部的类型,例如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);

【讨论】:

  • 我不想使用 auto 来实现兼容性。感谢您的回答,它有效
  • 老实说,这是一种可怕的类型,无论如何都要输入(抱歉)不止一次。为什么不在你的课堂上键入map&lt;...&gt; 并使用它?
  • @Useless :我链接的常见问题解答正是提出了这一点。 :-]
【解决方案2】:

您很可能也会在 GCC 中遇到错误。在这种情况下,'Typename' 是必需的。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2014-01-22
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多