我有一个std :: map
的子类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 :: map的特殊化,那么它会很好看
std::map<FancyKey,ValueT> fancymap;
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>
{
....
};
}
我收到此错误:
“部分专业化不允许使用默认参数”
但要使其像std :: map一样,它需要具有“继承”默认args 和允许它们被覆盖。下一步可能吗?
我确实看到了有可搜索模板常见问题解答的建议,看起来这似乎是一个非常常见的问题; ^&gt;
答案 0 :(得分:0)
避免键入makeKeyRef()
(在find
调用中)并在同一时间更明确地表达意图似乎很麻烦。您是否考虑过进行额外的打字并让未来的维护人员明白您的意图?
此外,由于标准容器没有虚拟析构函数,除非您非公开继承,否则当某个容器被基类指针销毁时,您将打开未定义的行为。