私はSTDのサブクラス::これが正常に動作しますどのように複数のキータイプのstdマップを特化できますか?
template<class ValueT>
FancyKeyMap
: public std::map<FancyKey,ValueT, FancyKey::Less>
{
...
public:
inline iterator find(FancyKeyArg key)
{
return(std::map<FancyKey,ValueT,
FancyKey::Less>::find(FancyKeyArg.makeKeyRef()));
}
};
は、(私はいくつかのimplicint変換を使用したくない理由を尋ねるいけないマップを持って、これはこの場合にも、完全な変換があまりにも多くのあいまいな過負荷が発生します高価:)上記のstd ::専門マップの任意
std::map<FancyKey,ValueT> fancymap;
が
と同じことを行うwoudlことができれば、とにかくが、それは素晴らしいことですwoudl
FancyKeyMap<ValueT> fancyMap;
このタイプのスペシャライゼーションは可能ですか?
が、それはのように振る舞うようにする "デフォルト引数は、部分的な特殊で許可されていません":私はこのエラーを取得する
namespace std {
template<class ValT, class CompareT=FancyKey::Less,
class AllocT=allocator<pair<const FancyKey,ValT> > >
class map<FancyKey, ValT, CompareT, AllocT>
{
....
};
}
:OK
はただ部分的な特殊化を試してみましたstd :: map "継承された"デフォルトargsを持つ必要がありますとはそれらをオーバーライドすることができます。次のステップは可能ですか?
私は、非常に一般的な質問であるように見えるん検索可能なテンプレートのよくある質問を持つための提案を参照してくださいました。^>
なぜあなたは 'FancyKeyMap'を持っていますか? – GManNickG
C++ 0xでは、FancyKeyMap = std :: map;を使用して 'tempate と言うことができます。 –
STLコンテナを継承することは、仮想デストラクタを持たないため、一般的に悪い習慣とみなされていることをご承知おきになると思います。クラスにデータメンバーを追加しない場合は、それを取り除くことはできますが、代わりに合成を使用するのが最善の方法です。 –