我的代码遇到了这个奇怪的问题,似乎编译器隐式地将我的参数转换为另一种类型。但是,当我将构造函数标记为显式时,它似乎无法解决问题。
我在单元测试中有这个
JsonValue stringItem("test");
CHECK(stringItem.type() == JsonValue::Type::String);
结果失败
4 == 3
这些是构造函数的样子......
JsonValue::JsonValue()
: mType(Type::Null) {
}
JsonValue::JsonValue(bool ab)
: mType(Type::Boolean) {
mData.b = ab;
}
JsonValue::JsonValue(int ai)
: mType(Type::Int) {
mData.i = ai;
}
JsonValue::JsonValue(std::uint32_t aui)
: mType(Type::UnsignedInt) {
mData.ui = aui;
}
// It should be using this constructory
// but mType is not getting set to Type::String
JsonValue::JsonValue(const std::string &astr)
: mType(Type::String) {
mData.str = new std::string(astr);
}
正如我之前提到的,将JsonValue(bool)
标记为explicit
并未解决问题。我还编译-Wconversion
没有警告
Enum看起来像这样
enum Type {
Null = 0,
Object,
Array,
String,
Boolean,
Int,
UnsignedInt
};
答案 0 :(得分:2)
您需要明确构造函数的参数:
JsonValue stringItem(std::string("test"));
正在发生的是您正在从const char*
到bool
进行隐式转换,因为这是内置类型之间的转换,而且比{{1}转换更好} const char*
,这是一个涉及内置类型的转换。
或者,您可以添加一个带std::string
的构造函数并在内部存储字符串。这是一个更好的选择,因为它避免了您遇到的容易出错:
const char*
请注意,表面上似乎没有理由存储动态分配的字符串。这可能会增加不必要的复杂性。