在一些开发平台上,你会得到超过4,000个字符的错误消息。更遭的是,有时候这些消息没有提示错误的来源。
STLFilt是一个C++的STL出错消息澄清器(decryptor),这个工具通过把错误消息缩短来解决上面讨论的问题,从而帮助你理解起来更容易一些。
要使用这个工具,你要给你的系统安装一个Perl解释器。
STLFilt适用于:
下面的简单例子用来产生一个错误:
#include <map>
#include <utility>
int main()
{
using namespace std;
typedef map<int, double> valmap;
valmap m;
// 这里本来应该是:
// m.insert( std::make_pair( 1, 2.0));
m.insert(1,2.0);
return 0;
}
没安装STLFilt前,Microsoft Visual C++ 6产生下面的出错消息:
error C2664: 'class std::_Tree<int,struct std::pair<int
const ,double>,struct std::map<int,double,struct std::less<int>,class
std::allocator<double> >::_Kfn,struct std::less<int>,class
std::allocator<double> >::iterator __thiscall std::map<int,double,struct
std::less<int>,class std::allocator<double> >::insert(class
std::_Tree<int,struct std::pair<int const ,double>,struct std::map<int,double,struct
std::less<int>,class std::allocator<double> >::_Kfn,struct
std::less<int>,class std::allocator<double> >::iterator,const
struct std::pair<int const ,double> &)' : cannot convert parameter
1 from 'const int' to 'class std::_Tree<int,struct std::pair<int const
,double>,struct std::map<int,double,struct std::less<int>,class
std::allocator<double> >::_Kfn,struct std::less<int>,class
std::allocator<double> >::iterator'
No constructor could take
the source type, or constructor overload resolution was ambiguous
安装STLFilt后,出错消息以一种更易于处理的形式出现:
error C2664: 'map<int,double>::iter map<int,double>::insert(map<int,double>::iter,const
pair<int,double> &)': cannot convert parameter 1 from 'const int'
to 'map<int,double>::iter'
No constructor could take
the source type, or constructor overload resolution was ambiguous