将模板类作为模板的模板类不会编译
Template class that takes a template class as template won't compile
>我正在尝试创建一个将地图作为模板参数的类。特别是它应该能够采用std::map和boost::p tr_map。目前我正在尝试这个:
template <template<typename, typename> class MAP, typename KEYTYPE, typename DATATYPE>
class RestrictedMapBase
{
/* bunch of methods ... */
}
这个类被另外两个类继承,一个用于 std::map,一个用于 boost::p tr_map。
template <typename KEYTYPE, typename DATATYPE>
class RestrictedMap: public RestrictedMapBase<std::map, KEYTYPE, DATATYPE>
{
/* Bunch of methods ... */
};
template <typename KEYTYPE, typename DATATYPE>
class RestrictedPointerMap: public RestrictedMapBase<boost::ptr_map, KEYTYPE, DATATYPE>
{
/* Bunch of methods ... */
};
但是在编译时,我收到这些错误:
RestrictedMap.h(166(:错误 C3201:模板参数列表 类模板"std::map"与模板参数列表不匹配 对于模板参数"MAP"受限地图.h(183(:请参阅参考 到类模板实例化 'STLUtils::RestrictedMap' 正在编译中
RestrictedMap.h(186(:错误 C3201:模板参数列表 类模板"提升::p tr_map"与模板参数不匹配 模板参数 'MAP' 列表 受限地图.h(203( : 见 对类模板实例化的引用 'STLUtils::RestrictedPointerMap' 正在编译
谁能指出我做错了什么的正确方向?谢谢。
std::map 需要一个模板参数来定义它的映射。见下文:
template <typename KEYTYPE, typename DATATYPE>
class RestrictedMap: public RestrictedMapBase<std::map<KEYTYPE, DATATYPE>, KEYTYPE, DATATYPE>
{
/* Bunch of methods ... */
};
基类模板参数KEYTYPE
,然后DATATYPE
变得多余。你可以用 std::map 类中提供的 typedef 替换它们:
std::map<_Kty, _Ty>::key_type; // This is the same as KEYTYPE
std::map<_Kty, _Ty>::mapped_type; // This is the same as DATATYPE
我会像这样重写你的类(我还没有测试过这个(:
template <typename Map>
class RestrictedMap
{
public: // Typedefs
typedef typename Map::key_type KeyType;
typedef typename Map::mapped_type MapType;
public: // Methods
// TODO: Write your methods here.
void Add(const KeyType &key, const MapType &map);
private: // Members
Map m_map;
};
然后你可以像这样选择你的地图(同样未经测试(:
typedef RestrictedMap<std::map<int, int>> StlMap; // TODO: Change your map's key and data type
typedef RestrictedMap<boost::ptr_map<int, int>> BoostMap; // TODO: Change your map's key and data type
此处提供完整示例 - http://ideone.com/U3AkV
类模板std::map
有 4 个参数:
template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class map
因此,它不能通过template<typename, typename>
传递,就像你不能将指向 3 参数函数的指针分配给指向 2 参数函数的指针一样。
解决方案是将要使用的确切类型传递给RestrictedMapBase
:
template <typename MAP>
class RestrictedMapBase
{
typedef typename MAP::key_type KEYTYPE;
typedef typename MAP::mapped_type DATATYPE;
};
您的初始设计还限制了类的用户,因为他们无法为键指定比较函数(如果他们想要使用哈希表,则指定哈希函数(和分配器。