隐式转换和string :: operator =()

时间:2014-05-06 18:21:37

标签: c++ c++11 type-conversion implicit-conversion

我遇到隐式转换问题。

我有类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的情况下使用它?

谢谢:)

2 个答案:

答案 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");