std::map等容器 谓词 _Pr使用lambda 出错

来源:互联网 发布:九一三事件知乎 编辑:程序博客网 时间:2024/05/17 22:08

一直以为map的模板参数填_Pr谓词的方法和使用algorithm里面的算法填谓词一样。


今天用Qt creator写东西发现

std::map<MyClass,MyClass,[](const MyClass& lhs,const MyClass& rhs) -> bool {return ......;}>m;


这行代码会报错。提示 'std::map': invalid template argument for '_Pr', type expected。


以为是Qt不支持c++11,调了调,还是不行。


以为Qt对Lambda支持不完全,又用std::function包装了一下,也不行


又换到vs上做实验,仍旧不行。


仔细看了看,想了想才发现,以前在vs填谓词的时候是在构造函数里填的,不是填在模板参数里。


而且模板参数是要填 类型 的 ,不是填 实例 的。我真是蠢炸了。。。


Qt也害人不浅,对构造函数的提示根本不全,vs里map的构造函数会提示有十几个,里面有(_Pr& pred)这个构造函数可选。


Qt里面构造函数只提示默认构造函数,模板参数也不提示,我还是点到map的定义里才明确看到了四个模板参数。


想当然的就把lambda直接填到模板参数上了。


正确用法:


在模板参数里填谓词的类型,构造函数里填谓词的实例


比如要用lambda:

std::map<MyClass,MyClass,decltype(lambda)> m(lambda);



比如要用std::function

std::function<bool(const MyClass&,const MyClass&)> func;

func=......;

std::map<MyClass,MyClass,std::function<const MyClass&,const MyClass&>> m(func);



顺便鄙视一下自己,很早以前就发现qt对STL容器提示不全,根本没注意,自信不需要自动补全就可以盲打出来正确代码。

这次自信看了一波map的定义,就把lambda直接填到模板参数里了。蠢炸天……

还有,qt给的错误提示 type expected,多明显啊。。。把实例填进模板参数里了。。需要填类型。打脸啪啪响。。。


经实验,在Qt creator里,cpp里敲代码的时候,std::map<...> m();这样只提示无参数的构造函数。

如果显式调用构造函数std::map<...> m=std::map<...>(); 这样就会提示有11个构造函数(vs提示有14个)

但是对自定义类型,MyClass mc();这时候会提示所有的构造函数。。。

我真是一脸蒙蔽……


0 0
原创粉丝点击