【发布时间】:2011-06-30 01:27:05
【问题描述】:
我有一个 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()));
}
};
这很好用,(不要问我为什么不想使用一些隐式转换,这会导致太多模棱两可的重载,在这种情况下完全转换也很昂贵:)
无论如何,如果上面的内容可以是 std::map 的任何一个专业化,那就太好了
std::map<FancyKey,ValueT> fancymap;
会做和
一样的事情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 一样,它需要具有“继承的”默认参数 并且 允许它们被覆盖。下一步可能吗?
我确实看到了关于使用可搜索模板常见问题解答的建议,这似乎是一个非常常见的问题;^>
【问题讨论】:
-
你为什么有
FancyKeyMap? -
在 C++0x 中你可以说
tempate <typename T> using FancyKeyMap = std::map<FancyKey, T>;。 -
我希望您知道从 STL 容器继承通常被认为是不好的做法,因为它们没有虚拟析构函数。如果你不向你的类添加数据成员,你可以侥幸逃脱,但最好改用组合。
-
@Alex:添加数据成员与它无关。
struct f : std::map<int, int> {}; std::map<int, int>* x = new f; delete x;是未定义的行为。
标签: c++ templates specialization