gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:06:05 25 4
gpt4 key购买 nike

我有这个代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com