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

0 0