为什么我不能将类构造函数参数设置为默认值?

时间:2016-04-23 14:20:08

标签: c++ class constructor default

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对象但更复杂的东西怎么办?为什么我的第一次尝试不能编译?

3 个答案:

答案 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_)} {}
};