C ++使用模板提升lexical_cast?

时间:2011-06-17 21:05:37

标签: c++ templates boost mfc lexical-cast

我正在尝试构建一个将程序设置存储为std :: map的类。由于所有程序设置都存储为字符串,因此我喜欢一种存取方法,可以将程序设置返回到相关类型。我是C ++中的新手,这是我的第一次尝试:

class Settings
{
public:
    Settings(void);
    virtual ~Settings(void);

    enum SettingName {HomePageUrl, WindowWidth};

    template<class T>
    T Get(SettingName name)
    {
        return boost::lexical_cast<T>(settings_[name]);
    }

    template<class T>
    void Set(SettingName name, T value)
    {
        settings_[name] = boost::lexical_cast<CString>(value);
    }

private:
    std::map<SettingName, CString> settings_;

};  

但是,我收到编译错误:

...boost\boost_1_46_1\boost\lexical_cast.hpp(776): error C2678: binary '>>' :
no operator found which takes a left-hand operand of type
'std::basic_istream<_Elem,_Traits>' (or there is no acceptable conversion)

..settings.h(33) : see reference to function template instantiation
'Target boost::lexical_cast<CString,T>(const Source &)' being compiled

使用boost,错误输出很长,我不确定它有什么问题。

3 个答案:

答案 0 :(得分:3)

CString没有任何运算符&lt;&lt; 考虑使用std :: string

答案 1 :(得分:2)

  

二进制'&gt;&gt;' :没有操作员找到哪个   采用类型的左手操作数   '的std :: basic_istream&LT; _Elem,_Traits&GT;'

lexical_cast基本上尝试将对象写入流对象。

您需要&lt;&lt; &gt;&gt; 运算符定义为写入您正在使用的类中的流才能工作。 (取决于你是在读书还是写作)

答案 2 :(得分:2)

documentation所示,boost :: lexical_cast根据几件事的存在进行转换。源类型必须具有运算符&lt;&lt;采用std :: ostream(或std :: wostream),目标类型必须有一个运算符&gt;&gt;采用std :: istream(或std :: wistream)。这些函数的第一个参数是对流的非const引用,第二个参数是对要发送/构造的类型的引用。

为了将设置名称转换为T,该T必须具有运算符&gt;&gt;需要输入流。类似地,为了转换为CString,必须有一个运算符&lt;&lt;这需要一个输出流。