0

我正在尝试创建一个将地图作为模板参数的类。特别是它应该能够采用 std::map 和 boost::ptr_map。目前我正在尝试这个:

template <template<typename, typename> class MAP, typename KEYTYPE, typename DATATYPE>
class RestrictedMapBase
{
   /* bunch of methods ... */
}

这个类被另外两个类继承,一个用于std::map,一个用于boost::ptr_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”的模板参数列表不匹配 RestrictedMap.h(183):参见对类模板实例化的引用STLUtils::RestrictedMap' 正在编译

RestrictedMap.h(186):错误 C3201:类模板“boost::ptr_map”的模板参数列表与模板参数“MAP”的模板参数列表不匹配 RestrictedMap.h(203):参见对类模板实例化的引用STLUtils::RestrictedPointerMap' 正在编译

谁能指出我做错了什么的正确方向?谢谢。

4

2 回答 2

1

std::map 需要一个模板参数来定义它的映射。见下文:

template <typename KEYTYPE, typename DATATYPE>
class RestrictedMap: public RestrictedMapBase<std::map<KEYTYPE, DATATYPE>, KEYTYPE, DATATYPE>
{
   /* Bunch of methods ... */
};

然后你的基类模板参数KEYTYPEDATATYPE变得多余了。您可以用 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

于 2012-05-04T09:47:06.600 回答
0

类模板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;
};

您的初始设计还限制了您的类的用户,因为他们无法为键指定比较函数(如果他们想使用哈希表,则为哈希函数)和分配器。

于 2012-05-04T10:10:48.803 回答