0

マップをテンプレートパラメータとして受け取るクラスを作成しようとしています。特に、std::mapとboost::ptr_mapを取得できる必要があります。現在私はこれを試しています:

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

このクラスは、他の2つのクラスに継承されています。1つはstd :: map用で、もう1つは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 ... */
};

基本クラスのテンプレートパラメータ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

于 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 に答える