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