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

最佳答案

您试图将尚未创建对象的类的成员用作构造函数参数的默认值。除非成员是静态的,否则这将无法工作。为了做您想做的,您可以这样定义2个构造函数:

#include <map>
template<class KeyType, class ValueType, class Hash = std::hash<KeyType> >
class HashMap {
public:
    Hash hasher;

    HashMap(Hash override_) {
        hasher = override_;
    }
    HashMap() {
    }
};

关于c++ - 为什么不能将类构造函数参数设置为默认值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36811974/

10-09 22:55