热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Bug:“iterator_category”:不是*的成员——当自定义函数与系统函数重名

原出处:http:blog.csdn.netsxhelijianarticledetails8859653?utm_sourcetuicool&utm_mediumr

原出处:http://blog.csdn.net/sxhelijian/article/details/8859653?utm_source=tuicool&utm_medium=referral

有学生向我求助,他编了一个程序,设计一个“点”类,求出两点距离的程序。程序看着没有问题,却出了一大堆的错误。程序如下:

[cpp] view plaincopy
print?
  1. #include   
  2. #include   
  3. using namespace std;  
  4. class point  
  5. {  
  6. public:  
  7.     double x;  
  8.     double y;  
  9. };  
  10. double distance(point p1,point p2);  
  11.   
  12. int main()  
  13. {  
  14.     point p1= {3,5},p2= {6,9};  
  15.     cout<
  16. }  
  17.   
  18. double distance(point p1,point p2)  
  19. {  
  20.     double d&#61;sqrt((p1.x-p2.x)*(p1.x-p2.x)&#43;(p1.y-p2.y)*(p1.y-p2.y));  
  21.     return d;  
  22. }  

  在codeBlocks下编译&#xff0c;错误直接引到stl_iterator_base_types.h文件中&#xff0c;错误一大堆&#xff1a;

[plain] view plaincopy
print?
  1. ||&#61;&#61;&#61; example, Debug &#61;&#61;&#61;|  
  2. D:\C&#43;&#43;\codeBlock\example\example.cpp|15|instantiated from here|  
  3. d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c&#43;&#43;\bits\stl_iterator_base_types.h|127|error: no type named &#39;iterator_category&#39; in &#39;class point&#39;|  
  4. d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c&#43;&#43;\bits\stl_iterator_base_types.h|128|error: no type named &#39;value_type&#39; in &#39;class point&#39;|  
  5. d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c&#43;&#43;\bits\stl_iterator_base_types.h|129|error: no type named &#39;difference_type&#39; in &#39;class point&#39;|  
  6. d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c&#43;&#43;\bits\stl_iterator_base_types.h|130|error: no type named &#39;pointer&#39; in &#39;class point&#39;|  
  7. d:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c&#43;&#43;\bits\stl_iterator_base_types.h|131|error: no type named &#39;reference&#39; in &#39;class point&#39;|  
  8. ||&#61;&#61;&#61; Build finished: 5 errors, 0 warnings &#61;&#61;&#61;|  

  对于这样的问题&#xff0c;初学C&#43;&#43;的同学肯定直接蒙。这里的问题出在命名空间中名字的冲突&#xff0c;再多说一些&#xff0c;与STL也有些关系。不过&#xff0c;解决这样的问题并不一定得知道这么多。我还是试着与大家绕开这个环节&#xff0c;从其他途径找点感觉。

  光标置到“D:\C&#43;&#43;\codeBlock\example\example.cpp|15|instantiated from here|”一行&#xff0c;双击&#xff0c;发现错误在程序的第15行。鼠标放到15行的distance函数上时&#xff0c;浮现出了一行提示&#xff0c;见图&#xff1a;


  看出了一点疑惑&#xff1a;distance不是在这个程序中编的自定义函数吗&#xff1f;怎么识别成了std::distance(...,...)&#xff1f;

  这就是问题的根源&#xff01;编译器没有将distance当作自定义函数处理&#xff01;至于进一步的解释不再深入&#xff0c;抓住这个要点&#xff0c;程序就可以改好了。

  修改方法之一&#xff1a;既然函数名字上出问题&#xff0c;试试改个名字&#xff1f;将distance改个名字&#xff0c;如dist&#xff0c;一切正常。

  修改方法之二&#xff1a;凭什么让我改&#xff1f;distance多好的一个函数名&#xff08;不过提醒&#xff0c;可以自学一下命名空间了&#xff0c;此是好机会&#xff0c;不必等着老师讲。&#xff09;需要做的工作是&#xff0c;不用std命名空间&#xff08;删除或注释掉using namespace std;一行&#xff09;然后在依赖std的cout前加上std::&#xff0c;程序如下&#xff1a;

[cpp] view plaincopy
print?
  1. #include   
  2. #include   
  3. //using namespace std;//不再用命名空间std  
  4. class point  
  5. {  
  6. public:  
  7.     double x;  
  8.     double y;  
  9. };  
  10. double distance(point p1,point p2);  
  11.   
  12. int main()  
  13. {  
  14.     point p1&#61; {3,5},p2&#61; {6,9};  
  15.     std::cout<//保证编译系统知道用std命名空间中的cout  
  16. }  
  17.   
  18. double distance(point p1,point p2)  
  19. {  
  20.     double d&#61;sqrt((p1.x-p2.x)*(p1.x-p2.x)&#43;(p1.y-p2.y)*(p1.y-p2.y));  
  21.     return d;  
  22. }  
  修改方法之三&#xff1a;方法二有点自私了。std中有不少常用的东东&#xff0c;就此全都得写std::&#xff0c;这个程序中无妨&#xff0c;如果再大些的程序呢&#xff1f;胳膊不必和大腿拧&#xff0c;换种思路&#xff0c;也是一样。将distance在调用时&#xff0c;写作为::distance&#xff0c;指出distance是当前程序中定义的名字。问题解决就此解决&#xff0c;程序如下&#xff1a;

[cpp] view plaincopy
print?
  1. #include   
  2. #include   
  3. using namespace std;  
  4. class point  
  5. {  
  6. public:  
  7.     double x;  
  8.     double y;  
  9. };  
  10. double distance(point p1,point p2);  
  11.   
  12. int main()  
  13. {  
  14.     point p1&#61; {3,5},p2&#61; {6,9};  
  15.     cout<<::distance(p1,p2);//指定distance不是别处的&#xff0c;就是本文件中定义的  
  16. }  
  17.   
  18. double distance(point p1,point p2)  
  19. {  
  20.     double d&#61;sqrt((p1.x-p2.x)*(p1.x-p2.x)&#43;(p1.y-p2.y)*(p1.y-p2.y));  
  21.     return d;  
  22. }  
  修改方法之四&#xff1a;前三种方法中&#xff0c;个人倾向于第一种&#xff0c;山不转水转&#xff0c;换个名字也妨。其实这也不是最好的。原始的程序中定义了类&#xff0c;但只有数据成员&#xff0c;没有成员函数&#xff0c;像求距离之类的&#xff0c;设计为成员函数多好。面向对象的机制就是为了信息封装等特性的&#xff0c;为何要如此浪费&#xff1f;这个程序我就不写了&#xff0c;请自行解决。


  补充&#xff1a;用其他编程环境时&#xff0c;观察和修改的方法也类似&#xff0c;例如在VS2008下编译&#xff0c;错误居然有25个之多&#xff1a;

[plain] view plaincopy
print?
  1. 1>------ 已启动生成: 项目: example, 配置: Debug Win32 ------  
  2. 1>正在编译...  
  3. 1>example.cpp  
  4. 1>d:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2039: “iterator_category”: 不是“point”的成员  
  5. 1>        d:\c&#43;&#43;\vs2008 project\example\example\example.cpp(5) : 参见“point”的声明  
  6. 1>        d:\c&#43;&#43;\vs2008 project\example\example\example.cpp(16): 参见对正在编译的类 模板 实例化“std::iterator_traits<_Iter>”的引用  
  7. 1>        with  
  8. 1>        [  
  9. 1>            _Iter&#61;point  
  10. 1>        ]  
  11. &#xff08;此处省略N多的提示&#xff09;  
  12.   
  13.   
  14. 1>生成日志保存在“file://d:\C&#43;&#43;\VS2008 project\example\example\Debug\BuildLog.htm”  
  15. 1>example - 25 个错误&#xff0c;0 个警告  
  16. &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; 生成: 成功 0 个&#xff0c;失败 1 个&#xff0c;最新 0 个&#xff0c;跳过 0 个 &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;  


  在源程序中&#xff0c;鼠标光临distance函数时&#xff0c;可以看出编译器对distance函数有两种解释&#xff0c;如下图&#xff1a;


  编译器对此局面真的很迷茫了。余下的修改思路相同&#xff0c;不再罗嗦。






推荐阅读
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
author-avatar
手机用户2502936007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有