我的目标是创建可为空的值,该值同时采用默认值函数和密钥来从闪存存储中检索该值的潜在自定义。
但是尝试将其实例化为属性成员时,我收到两个参数的“预期类型说明符”编译错误。
如何解决这个问题?
这是我如何在类中使用构造函数的:
class BatteryConfig {
static float _defaultPackL1Undervoltage();
FloatStorageNullableWithDefault packL1Undervoltage("PackL1UndervoltageKey", _defaultPackL1Undervoltage); // <<<== the errors here
};
这是我的基类:
template <typename T>
class Nullable {
public:
Nullable() : hasValue_(false) {}
Nullable(const T& value) : hasValue_(true), value_(value) {}
bool hasValue() const { return hasValue_; }
virtual T get() const {
if (!hasValue_) {
throw std::runtime_error("Nullable value is not set");
}
return value_;
}
virtual void set(const T& value) {
hasValue_ = true;
value_ = value;
}
protected:
bool hasValue_;
T value_;
};
template <typename T>
class NullableWithDefault : public Nullable<T> {
public:
NullableWithDefault(const std::function<T()>& defaultValue) : Nullable<T>(), defaultValue_(defaultValue) {}
T get() const override {
if (!hasValue()) {
return defaultValue_();
}
return Nullable<T>::get();
}
protected:
std::function<T()> defaultValue_;
};
class FloatStorageNullableWithDefault : public NullableWithDefault<float> {
public:
FloatStorageNullableWithDefault(
const std::string& key,
const std::function<float()>& defaultValue
) : NullableWithDefault<float>(defaultValue), key_(key) {}
/// returns the key
std::string getKey() const { return key_; }
private:
const std::string key_;
};
我看到您正在尝试使用默认值函数和密钥创建一个可为空的值,以从闪存存储中检索该值的潜在自定义。但是,当尝试将其实例化为属性成员时,您会遇到编译错误。
问题在于您尝试使用非常量表达式初始化非静态成员变量。在 C++ 中,不能使用函数调用或非常量表达式来初始化非静态成员变量。
要解决此问题,您可以在 BatteryConfig 类的构造函数中使用初始值设定项列表。这是更正后的代码:
class BatteryConfig {
公众: BatteryConfig() : packL1UnderVoltage("PackL1UnderVoltageKey", _defaultPackL1UnderVoltage) {}
FloatStorageNullableWithDefault packL1Undervoltage;
static float _defaultPackL1Undervoltage() { /* implementation */ }
};
通过使用初始化列表,您可以确保在构造 BatteryConfig 对象时使用正确的参数初始化 packL1UnderVoltage 成员。
或者,您也可以使用默认成员初始值设定项,这是 C++11 中的新功能:
class BatteryConfig {
公众: FloatStorageNullableWithDefault packL1UnderVoltage = FloatStorageNullableWithDefault("PackL1UnderVoltageKey", _defaultPackL1UnderVoltage);
static float _defaultPackL1Undervoltage() { /* implementation */ }
};
这样,您可以使用默认值初始化 packL1Undervolt 成员,而无需在构造函数中使用初始化程序列表。