std:地图的第三个模板参数(比较函数)用lambda编译出错
std::map的第三个模板参数(比较函数)用lambda编译出错.
下面这几行程序会有编译错误:
我定义了一个function名叫f,想把它给map作为第三个参数(一个functor类型)
如果我把map的声明变成map<string,string,f> mss;也不行。
只有用传统的方法,声明一个functor才没有问题:
-------------------------为什么用lambda来做第三个模板参数就不行呢?
VC的编译错误是这样的: 没看懂什么叫不能声明lambda的instance
GCC4.7的编译错误是这样的,更看不懂了。
下面这几行程序会有编译错误:
我定义了一个function名叫f,想把它给map作为第三个参数(一个functor类型)
- C/C++ code
#include<map> #include<string> using namespace std; int main(int argc, char* argv[]) { map<string,string,less<string>> ms1;//OK auto f=[](const string& s1,const string& s2)->bool{ return s1<s1; }; map<string,string,decltype(f)> mss; return 0; }
如果我把map的声明变成map<string,string,f> mss;也不行。
只有用传统的方法,声明一个functor才没有问题:
- C/C++ code
struct f{ bool operator()(const string& s1,const string& s2){ return s1<s1; } }; map<string,string,f> mss;
-------------------------为什么用lambda来做第三个模板参数就不行呢?
VC的编译错误是这样的: 没看懂什么叫不能声明lambda的instance
- C/C++ code
1>c:\program files\microsoft visual studio 10.0\vc\include\map(104): error C3497: you cannot construct an instance of a lambda 1> c:\program files\microsoft visual studio 10.0\vc\include\map(104) : while compiling class template member function 'std::map<_Kty,_Ty,_Pr>::map(void)' 1> with 1> [ 1> _Kty=std::string, 1> _Ty=std::string, 1> _Pr=`anonymous-namespace'::<lambda0> 1> ] 1> d:\proj\test10\testtype\testtype.cpp(16) : see reference to class template instantiation 'std::map<_Kty,_Ty,_Pr>' being compiled 1> with 1> [ 1> _Kty=std::string, 1> _Ty=std::string, 1> _Pr=`anonymous-namespace'::<lambda0> 1> ] 1>
GCC4.7的编译错误是这样的,更看不懂了。
- C/C++ code
D:\>g++ my.cpp -std=c++11 In file included from d:\software\mingw9\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/map:60:0, from my.cpp:1: d:\software\mingw9\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Rb_tree_impl<_Ke _compare, _Is_pod_comparator>::_Rb_tree_impl() [with _Key_compare = main(int, char**)::<lambda(const string&, const string&)>; bool _Is_pod_comparator = false; _Key = std::basic_string<char>; _Val = td::pair<const std::basic_string<char>, std::basic_string<char> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _Compare = main(int, char**)::<l mbda(const string&, const string&)>; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]': d:\software\mingw9\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/bits/stl_tree.h:623:18: required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Rb_tree() [wi h _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, std::basic_string<char> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, std::basic_string<c ar> > >; _Compare = main(int, char**)::<lambda(const string&, const string&)>; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]' d:\software\mingw9\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/bits/stl_map.h:155:14: required from 'std::map<_Key, _Tp, _Compare, _Alloc>::map() [with _Key = std::basic_stri g<char>; _Tp = std::basic_string<char>; _Compare = main(int, char**)::<lambda(const string&, const string&)>; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> >]' my.cpp:10:36: required from here d:\software\mingw9\bin\../lib/gcc/i686-pc-mingw32/4.7.0/../../../../include/c++/4.7.0/bits/stl_tree.h:445:21: error: use of deleted function 'main(int, char**)::<lambda(const string&, const string&)> :<lambda>()' my.cpp:7:13: note: a lambda closure type has a deleted default constructor