2

我正在尝试构建一个将程序设置存储为 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 的错误输出很长,我不确定它有什么问题。

4

3 回答 3

4

CString 没有任何操作符<< 考虑使用 std::string

于 2011-06-17T21:07:34.603 回答
3

二进制“>>”:未找到采用“std::basic_istream<_Elem,_Traits>”类型的左操作数的运算符

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

您需要定义<<>>运算符以写入您正在使用的类中的流以使其工作。(取决于你是阅读还是写作)

于 2011-06-17T21:18:29.173 回答
3

文档中所示, boost::lexical_cast 会根据几件事的存在进行转换。源类型必须有一个接受 std::ostream(或 std::wostream)的 operator<<,而目标类型必须有一个接受 std::istream(或 std::wistream)的 operator>>。这些函数的第一个参数是对流的非常量引用,第二个参数是对要发送/构造的类型的引用。

为了将设置名称转换为 T,该 T 必须具有接受输入流的运算符>>。同样,为了转换为 CString,必须有一个 operator<< 接受输出流。

于 2011-06-17T21:28:19.360 回答