过去我在c++中同时使用模板和动态绑定,但最近我试图将它们一起使用,却发现无法编译。
我想做的是这样的:
std::map<MyClass, unsigned int> mymap;
MyClass恰好是一个使用动态内存绑定的类。经过几个小时的搜索,我得到的印象是这导致了我仍然无法解决的影响,所以我希望在这个问题上得到一些指导,以及如何解决它。
我的最终目标是能够做这样的事情:
std::vector<MyClass> MyClassPool;
//fill the vector with MyClass objects...
for(usigned int i=0 ; i<MyClassPool.size() ; i++)
{
mymap[ MyClassPool[i] ] = i;
}
我试过用各种方法使用指针,但它不起作用,我看不出还能做什么。
我得到了以下错误:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Instance]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_map.h:338: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Instance, _Tp = float, _Compare = std::less<Instance>, _Alloc = std::allocator<std::pair<const Instance, float> >]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'
编译错误意味着您没有为Instance
定义operator <
。map
需要能够排序键,需要这个功能。如果你不想定义operator <
,你需要提供一个比较函数作为map
的第三个模板参数,即std::map<Instance, float, compare_instances>
。
…仔细想想,您确定希望Instance
作为键,float
作为数据,而不是相反吗?也就是说,你在地图上搜索一个Instance
得到一个float
作为回报?
您不为MyClass
提供operator<
。这是std::map
要求的。您有两种选择:提供比较器作为map
的第三个模板参数,或者在MyClass
中实现运算符。
这与"动态绑定"无关(反正这不是这里的意思)。您的类需要有一个顺序才能放入地图中。