错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
error C2760: syntax error: unexpected token 'identifier', expected ';' at map iterator
我创建了一个继承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'
似乎在编译时没有定义迭代器类型。有什么解决方案可以解决这个问题吗?
你可以通过以下方式修复它:
typename std::map<std::string, _Value>::iterator itr = this->begin();
或
auto itr = this->begin();
错误消息会准确地告诉您可以执行的操作:
typename std::map<std::string, _Value>::iterator itr = this->begin();
// ^^^^^^^^^
......但不是为什么你必须这样做。
简而言之,这是与模板和所谓的"从属名称"相关的C++怪癖。由于_Value
是模板参数,并且存在模板专用化,因此C++直到分析过程的稍后阶段才能确定std::map<std::string, _Value>
是否具有成员类型iterator
。因此,您的声明格式不正确,因为编译器即使眯着眼睛也无法将其视为声明。typename
说"这将是一种类型,我保证",然后一切都很好(只要它确实变成了一种类型!
你可能认为这应该是C++的问题,而不是你的问题,你可能是对的,但事实就是如此。您可以搜索有关此的更多信息,或者只是想当然地认为,当编译器告诉您编写typename
时,您编写typename
。
或者,通过使用auto
来使您的代码更好并同时解决问题:
auto itr = this->begin();
顺便说一下,你的代码表明你使用了错误的容器,GetItem
应该是const
的,你应该使用cbegin()
而不是begin()
(尽管如果你遵循const
建议,这是为你做的(,std::advance
已经存在......
要修复错误,您可以按照编译器给出的提示进行操作,也可以将行更改为
auto itr = this->begin();
虽然过度使用auto
是值得怀疑的,但通常认为迭代器类型是可以的;返回begin()
和end()
成员函数的类型很常见(有时很复杂(,以至于不键入确切的类型。
另一个旁注:GetItem
也可以使用const_iterator
,因此auto itr = this->cbegin();
将是一个改进。
- 设置 Visual Studio for MPI: 找不到标识符错误
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++:枚举:错误:应使用标识符而不是"}"
- 我的代码中有错误,未声明的标识符
- 错误:在 C++ 'std'使用未声明的标识符
- 从子类访问模板类成员时出现"找不到标识符"错误
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 未声明的标识符错误,但变量定义正确 (?)
- C++ 多态构造函数错误;标识符未定义
- 虚幻引擎4:UShape组件给出错误"标识符未定义"。我能做什么?
- 如何修复可视化工作室中的"C2061语法错误标识符"堆栈?
- C++结构错误 - 错误 C2061:语法错误:标识符
- 在给定的代码中获取错误(标识符未定义)
- 视觉 在调用它时用 c++ 创建一个方法后,我得到的错误标识符未找到
- C++Visual Studio类错误标识符字符串未定义
- C++错误C2061:语法错误:标识符
- 智能感知错误标识符"emlrtStack"未定义
- 错误:标识符未在c++中定义
- Visual Studio错误:语法错误:标识符
- 错误 C2061:语法错误:标识符,但已包含头文件