使用c++模板与动态绑定类



过去我在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中实现运算符。

这与"动态绑定"无关(反正这不是这里的意思)。您的类需要有一个顺序才能放入地图中。

相关内容

  • 没有找到相关文章

最新更新