template<class KeyType, class ValueType, class Hash = std::hash<KeyType> >
class HashMap {
public:
Hash hasher;
HashMap(Hash override_ = hasher) {
hasher = override_;
}
};
这是我的代码。我期望发生的是,如果构造函数没有提供hasher
,我保留默认值,否则将其更改为new。我得到的是:invalid use of non-static data member 'hasher'
。我已经知道我可以将hasher
替换为Hash()
作为默认值;但是如果我不需要默认的Hash
对象但更复杂的东西怎么办?为什么我的第一次尝试不能编译?
答案 0 :(得分:2)
您尝试将构造函数参数的默认值用作类的成员,而尚未创建对象。除非成员是静态的,否则这不起作用。为了做你想做的事,你可以这样定义2个构造函数:
#include <map>
template<class KeyType, class ValueType, class Hash = std::hash<KeyType> >
class HashMap {
public:
Hash hasher;
HashMap(Hash override_) {
hasher = override_;
}
HashMap() {
}
};
答案 1 :(得分:0)
按照标准禁止。这在C ++ 03标准的8.3.6节中有详细说明。它基本上等于任何不依赖于局部范围内任何东西的表达式,因此任何表达式依赖于局部变量,函数的参数或者&#34;这个&#34;被排除在外。
答案 2 :(得分:0)
嗯,你能做的是:
template<class KeyType, class ValueType, class Hash = std::hash<KeyType> >
class HashMap {
public:
Hash hasher;
HashMap(Hash override_ = {}) : hasher{std::move(override_)} {}
};
如果没有提供,则调用默认构造函数。
就个人而言,我认为最好的选择是添加默认构造函数:
template<class KeyType, class ValueType, class Hash = std::hash<KeyType> >
class HashMap {
public:
Hash hasher;
HashMap() = default;
HashMap(Hash override_) : hasher{std::move(override_)} {}
};