我遇到隐式转换问题。
我有类ConfigValue
,它包含两种类型的值 - int和string。是的,我需要存储这两种类型,因为配置文件包含一些int一些字符串值。
该类实现了两个转换运算符:
ConfigValue::operator int() const {
if( m_type != TYPE_INT )
throw ConfigException( ConfigException::ERR_INVALID_TYPE, m_key );
return m_ival;
}
ConfigValue::operator std::string() const {
if( m_type != TYPE_STRING )
throw ConfigException( ConfigException::ERR_INVALID_TYPE, m_key );
return m_sval;
}
下一个班级是Config
,它有值映射:<std::string, ConfigValue>
。有时候我需要获得一些价值,所以它实现了方法get:
const ConfigValue & Config::get( const std::string& key) const {
auto pos = m_values.find( key );
if( pos == m_values.end() )
throw ConfigException( ConfigException::ERR_MISSING_KEY, key );
return m_values.at(key);
}
我的问题和问题在这里:
// error: error: ambiguous overload for ‘operator=’ in ‘msg =
// in one of candidates:
// no known conversion for argument 1 from ‘const ConfigValue’ to ‘const char*’
string msg;
msg = config->get("DEFAULT_MSG");
// ok:
int port;
port = config->get("DEFAULT_PORT");
// ok:
string msg;
msg = static_cast<string>( config->get("DEFAULT_MSG") );
// ok:
string msg;
string tmp = config->get("DEFAULT_MSG");
msg = tmp;
因此,如果我尝试将get()中的值分配给已创建的字符串对象,则会失败。
我试图实现operator char*()
但是我得到了同样的错误并且“没有已知的转换......”消失了。
我是否必须实现另一个转换运算符或其他东西才能在没有static_cast的情况下使用它?
谢谢:)
答案 0 :(得分:0)
尝试更改
ConfigValue::operator std::string() const
到
ConfigValue::operator const std::string&() const
如果这不能解决您的问题,您可能会卡住为int和字符串类型添加显式getter
答案 1 :(得分:0)
由于ConfigValue
过度工程化,是否需要进行这些隐式转换?它似乎是在没有必要的情况下构建的。没有它,您可以直接从配置中获得所需内容,而且所有内容看起来都更加清晰且类型安全:
string msg;
msg = config->getString("DEFAULT_MSG");
int port;
port = config->getInt("DEFAULT_PORT");