ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间 -- 原因可能是参数错误或者自定义函数名和库函数名冲突

2021-05-29 23:52:22  阅读:232  来源: 互联网

标签:std 自定义 rtm vs2013 ult chs error include 库函数


今天运行程序的时候遇到了下面这个bug

1>  B1020.cpp
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(584): 参见对正在编译的类 模板 实例化“std::iterator_traits<_InIt>”的引用
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\algorithm(3155): 参见对正在编译的函数 模板 实例化“void std::_Debug_range<_RanIt>(_InIt,_InIt,std::_Dbfile_t,std::_Dbline_t)”的引用
1>          with
1>          [
1>              _RanIt=int
1>  ,            _InIt=int
1>          ]
1>          e:\c++\common\algorithmnote\algorithmnote\b1020.cpp(48): 参见对正在编译的函数 模板 实例化“void std::sort<int,bool(__cdecl *)(mooncake,mooncake)>(_RanIt,_RanIt,_Pr)”的引用
1>          with
1>          [
1>              _RanIt=int
1>  ,            _Pr=bool (__cdecl *)(mooncake,mooncake)
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2039: “iterator_category”: 不是“`global namespace'”的成员
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2146: 语法错误: 缺少“;”(在标识符“iterator_category”的前面)
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2602: “std::iterator_traits<_InIt>::iterator_category”不是“std::iterator_traits<_InIt>”基类的成员
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371) : 参见“std::iterator_traits<_InIt>::iterator_category”的声明
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(371): error C2868: “std::iterator_traits<_InIt>::iterator_category”: 非法的 using 声明语法;应输入限定名
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2039: “value_type”: 不是“`global namespace'”的成员
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2146: 语法错误: 缺少“;”(在标识符“value_type”的前面)
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2602: “std::iterator_traits<_InIt>::value_type”不是“std::iterator_traits<_InIt>”基类的成员
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372) : 参见“std::iterator_traits<_InIt>::value_type”的声明
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(372): error C2868: “std::iterator_traits<_InIt>::value_type”: 非法的 using 声明语法;应输入限定名
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2039: “difference_type”: 不是“`global namespace'”的成员
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2146: 语法错误: 缺少“;”(在标识符“difference_type”的前面)
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2602: “std::iterator_traits<_InIt>::difference_type”不是“std::iterator_traits<_InIt>”基类的成员
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373) : 参见“std::iterator_traits<_InIt>::difference_type”的声明
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(373): error C2868: “std::iterator_traits<_InIt>::difference_type”: 非法的 using 声明语法;应输入限定名
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2039: “pointer”: 不是“`global namespace'”的成员
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2146: 语法错误: 缺少“;”(在标识符“pointer”的前面)
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2602: “std::iterator_traits<_InIt>::pointer”不是“std::iterator_traits<_InIt>”基类的成员
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375) : 参见“std::iterator_traits<_InIt>::pointer”的声明
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(375): error C2868: “std::iterator_traits<_InIt>::pointer”: 非法的 using 声明语法;应输入限定名
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2039: “reference”: 不是“`global namespace'”的成员
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2146: 语法错误: 缺少“;”(在标识符“reference”的前面)
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2602: “std::iterator_traits<_InIt>::reference”不是“std::iterator_traits<_InIt>”基类的成员
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376) : 参见“std::iterator_traits<_InIt>::reference”的声明
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(376): error C2868: “std::iterator_traits<_InIt>::reference”: 非法的 using 声明语法;应输入限定名
1>          with
1>          [
1>              _InIt=int
1>          ]
1>e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(584): error C2665: “std::_Debug_range2”: 2 个重载中没有一个可以转换所有参数类型
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(567): 可能是“void std::_Debug_range2<_InIt>(_RanIt,_RanIt,std::_Dbfile_t,std::_Dbline_t,std::random_access_iterator_tag)”
1>          with
1>          [
1>              _InIt=int
1>  ,            _RanIt=int
1>          ]
1>          e:\vs2013\vs2013_rtm_ult_chs\data\vc\include\xutility(559): 或       “void std::_Debug_range2<_InIt>(_InIt,_InIt,std::_Dbfile_t,std::_Dbline_t,std::input_iterator_tag)”
1>          with
1>          [
1>              _InIt=int
1>          ]
1>          尝试匹配参数列表“(int, int, std::_Dbfile_t, std::_Dbline_t, int)”时

  首先看到这么多的错误信息就头大,看都不想看,所以我没仔细看这些错误信息,就直接把错误信息的第一行复制到浏览器中去找解决办法,找了挺久时间,确实看到了类似的错误信息,但是跟我也不完全一样,最后看到网上说出现这种情况的原因可能是参数错误或者自定义函数名和库函数名冲突,函数名冲突这个可以排除,因为我确保函数名没有冲突,所以就定位在了参数错误,最后发现 sort 函数的前两个参数必须是迭代器或指针,但是我写了两个整型,所以报错。

  出错的位置

1 // 排序
2 // sort(cakes, cakes + N, cmp);        // 正确写法
3 // sort(0, N, cmp);                    // 错误写法

  查到的sort函数声明

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

  总结:回过头来仔细看看错误信息,发现确实有一点可以看懂的提示,就是我标红的那段,所有提示中出现的函数名中只有这个sort函数名是我见过的,说明其他的都是库函数,说明错误一定是这个sort函数的调用错误,而且貌似标红的错误信息中还提示了参数不匹配的信息,但是由于对冗长错误信息的恐惧感,促使我一开始选择跳过这些错误提示,如果早一点看到这个信息,可以省很多时间,所以告诉自己以后如果再碰到这种又臭又长又看不懂的错误信息时,第一时间不要跳过这些提示,应该从中找到自己认识的部分,很可能错误就出在那里。

标签:std,自定义,rtm,vs2013,ult,chs,error,include,库函数
来源: https://blog.51cto.com/u_14201949/2832227

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有