错误 C2760:语法错误:意外标记“标识符”,应为“;”在地图迭代器

新手上路,请多包涵

我创建了一个继承 std::map 的类,并尝试使用一种方法在特定索引处获取值。

 #define MYAPI_EXPORTS
#ifdef MYAPI_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

    template<class _Value>
    class MY_API MyDictionary : public std::map<std::string, _Value>
    {
        _Value GetItem(int index)
        {
            std::map<std::string, _Value>::iterator itr = this->begin(); //compile error at this line

            int c = 0;
            while (c < index)
            {
                itr++;
                c++;
            }
            return itr->second;
        }
    };

‘std::map::iterator itr’ 这一行在编译时显示错误。

错误是

error C2760: syntax error: unexpected token 'identifier', expected ';'
error C7510: 'iterator': use of dependent type name must be prefixed with 'typename'

似乎迭代器类型未在编译时定义。有什么解决方案可以解决这个问题吗?

原文由 S.Frank Richarrd 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

您可以通过以下方式修复它:

 typename std::map<std::string, _Value>::iterator itr = this->begin();

或者

auto itr = this->begin();

原文由 zcorvid 发布,翻译遵循 CC BY-SA 4.0 许可协议

要修复错误,您可以按照编译器给出的提示或将行更改为

auto itr = this->begin();

虽然过度使用 auto 是有问题的,但对于迭代器类型通常认为是可以的; begin()end() 成员函数的返回类型很常见(有时很复杂),足以不输入确切的类型。

另一个旁注: GetItem 也可以使用 const_iterator ,因此 auto itr = this->cbegin(); 将是一个改进。

原文由 lubgr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题