effective stl 第49条:学会分析与STL相关的编译器诊断信息
来源:互联网 发布:ipad电视剧下载软件 编辑:程序博客网 时间:2024/05/19 14:19
string不是一个类,它是typedef。实际上,它是这个的typedef:
basic_string < char, char_traits<char>, allocator<char> > ;
因此,可以将所有的basic_string替换为string,举例如下:
example.cpp(20): error C2664:’__thiscall std::basic_string
//该类的目的是想用Map将昵称与对应的邮件地址之间建立联系class NiftyEmailProgram{private: typedef map<string, string> NicknameMap; NicknameMap nicknames;public: void showEmailAddress(const string& nickname) const { NicknameMap::iterator i = nicknames.find(nickname); if (i != nicknames.end()) { //如果找到了 } }};
不能通过编译,并有很多的提示信息,但是经过适当的替代之后,结果会很明显,比如上边的错误信息,将——Tree的参数换位< something>之后,就会发现有错误原因是因为将一个const_iterator转换为const,但是我们觉得很古怪,因为我们是在nicknames上调用find,而nicknames在非常量对象,find因此应该返回非常量iterator才对。通过查找发现,showEmailAddress是一个常量函数,在一个被声明为const的成员函数内部,该类的所有非静态数据成员都自动被转换为相应的const类型。
//该类的目的是想用Map将昵称与对应的邮件地址之间建立联系class NiftyEmailProgram{private: typedef map<string, string> NicknameMap; NicknameMap nicknames;public: void showEmailAddress(const string& nickname) const { NicknameMap::const_iterator i = nicknames.find(nickname); if (i != nicknames.end()) { //如果找到了 } }};
改成上边的算法之后就对了。
一些常见的错误提示诊断:
● 对于vector和string,迭代器有时是指针,所以如果你用迭代器犯了错误,编译器诊断信息可能会提及涉及指针类型。例如,如果你的源代码涉及vector < double>::iterator,编译器消息有时会提及double*指针。(一个值得注意的例外是当你使用来自STLport的STL实现,而且你运行在调试模式。那样的话,vector和string的迭代器干脆不是指针。对STLport和它调试模式的更多信息,转向条款50。)
● 提到back_insert_iterator、front_insert_iterator或insert_iterator的消息经常意味着你错误调用了back_inserter、front_inserter或inserter,一一对应,(back_inserter返回back_insert_iterator类型的对象,front_inserter返回front_insert_iterator类型的对象,而inserter返回insert_iterator类型的对象。关于使用这些inserter的信息,参考条款30。)如果你没有调用这些函数,你(直接或间接)调用的一些函数做了。
● 类似地,如果你得到的一条消息提及binder1st或binder2nd,你或许错误地使用了bind1st或bind2nd。
(bind1st返回binder1st类型的对象,而bind2nd返回binder2nd类型的对象。)
● 输出迭代器(例如ostream_iterator、ostreambuf_iterators(参见条款29),和从back_inserter、front_inserter和inserter返回的迭代器)在赋值操作符内部做输出或插入工作,所以如果你错误使用了这些迭代器类型之一,你很可能得到一条消息,抱怨在你从未听说过的一个赋值操作符里的某个东西。
● 你得到一条源于STL算法实现内部的错误信息(即,源代码引发的错误在< algorithm>中),也许是你试图给那算法用的类型出错了。例如,你可能传了错误种类的迭代器。要看看这样的用法错误是怎样报告的,通过把这段代码喂给你的编译器来启发(并愉快!)自己:
list<int>::iterator i1, i2; // 把双向迭代器sort(i1, i2); // 传给一个需要
错误信息为:
错误 4 error C2676: 二进制“-”:“std::_List_iterator
- effective stl 第49条:学会分析与STL相关的编译器诊断信息
- effective stl 第31条:了解与各种排序相关的选择
- Effective STL 第六条 当心C++编译器最烦人的分析机制
- Effective stl 第6条
- effective stl 第15条
- effective stl 第36条:理解copy_if的正确实现
- effective stl 第47条:避免产生“直写型”的代码
- Effective stl 第一章 第7、8条
- Effective STL 第一章 第9条
- Effective stl 第一章 第10条
- Effective STL 第2、3、4条
- Effective STL 第12条:切勿对STL容器的线程安全性有不切实际的依赖
- effective stl 第12条: 切勿对STL容器的线程安全性有不切实际的依赖
- effective stl 第46条:考虑使用函数对象而不是函数作为STL算法的参数
- Effective stl 第1章 容器 第5条
- Effective STL 第1条:慎重选择容器类型
- effective stl 第18条: 避免使用vector<bool>
- effective stl 第30条:确保目标区间足够大
- 03-树1 树的同构 (25分)
- 福尔摩斯的技能树
- hdu ---2010做题笔记(c++)
- 国内一个优秀的网络开源框架学习,轻量级网络框架学习NoHttp,可能是继Xutils之后的又一优秀框架
- 高效程序员的40个好习惯和行为方式
- effective stl 第49条:学会分析与STL相关的编译器诊断信息
- android studio for android learning (二十七) UI控件动态加载机制浅析
- [LeetCode]38. Count and Say
- HDU 5907 Find Q (简单题目)【BestCoder Round #88】
- 399. Evaluate Division
- Direct3D补充篇:表面缓冲区技术实现动画的流畅显示
- maven+springmvc+spring4+hibernate4整合
- 大型网站架构————核心原理-【可用性】4
- 全排列的非递归实现及递归实现