问题描述
定义了一个
template <typename T>std::map<const T, std::list<const T>*> map;
实际使用时 T 可能会是 char*,也可能是 long需要针对 T 的类型进行排序,可是单纯使用
struct CompareByLongValue { bool operator()(const long& k1, const long& k2) {return k1 < k2; }};
或是添加 template 声明后强制转换都编译过不去,求解
忧郁的更新:
实际上,我想将上面的那个 map 放到一个模板类里面去,在类内部实际上只支持为数不多的类型操作,比如 long, char*,所以想在类内部自动排序。
template <typename T>class Mapping { public: Mapping(); virtual ~Mapping(); private: std::map<const T, std::list<const T>*>* mapping_;};
如果在 map 定义的时候传入一个如下定义的结构体:
template <typename T>struct CompareByLongValue { bool operator()(const T& k1, const T& k2) { return k1 < k2; }};
编译器会不乐意:
No matching function for call to object of type ’const CompareByLongValue<long>’
分别在 stl map 的:
_LIBCPP_INLINE_VISIBILITY bool operator()(const _CP& __x, const _Key& __y) const// 460{return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);} _LIBCPP_INLINE_VISIBILITY bool operator()(const _Key& __x, const _CP& __y) const// 463{return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}// 以及 1207if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
问题解答
回答1:map 默认的比较对象的类型是 std::less<Key>
你可以看一下map的定义:
template< class Key, class T, class Compare = std::less<Key>, class Allocator = std::allocator<std::pair<const Key, T> >> class map;
如果你要修改默认的比较行为,可以在构造时传入你定义的比较类:map<long, string, CompareByLongValue> amap;
如果你的“map'变量是一个未指定具体类型的map类型, 那一种做法就是 Compare 也定义成一个模板类: map<T, string, MyCompare< T > > amap; 然后定义特化的MyCompare类。
template <> class MyCompare<long>{ bool operator()(const long& a, const long& b) const {... }}回答2:
long,char* 都不需要自定义比较啊。你的template <typename T>std::map<const T, std::list<const T>*> map;
是不是想写成template<typename T>using m_map=std::map<const T, std::list<const T>*> map;?