首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

std:地图的第三个模板参数(比较函数)用lambda编译出错

2012-08-22 
std::map的第三个模板参数(比较函数)用lambda编译出错.下面这几行程序会有编译错误:我定义了一个function

std::map的第三个模板参数(比较函数)用lambda编译出错.
下面这几行程序会有编译错误:
我定义了一个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 lambda1>          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>          with1>          [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 compiled1>          with1>          [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++11In 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**)::<lmbda(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() [wih _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<car> > >; _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_strig<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 hered:\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 



[解决办法]
探讨

引用:

不是写的很清楚么
map的比较函数必须可以无参构造
lambda对象的无参构造函数被标记为delete


"map的比较函数必须可以无参构造"这条限制有什么作用呢? 为什么要能无参构造,感觉没有意义啊。

热点排行