是否存在不能使赋值运算符重载的类型的异常?
具体来说,我想重载struct tm的赋值运算符(来自time.h),所以我可以为它分配一个sql :: ResultSet。
我已经拥有转换逻辑:
sscanf(sqlresult->getString("StoredAt").c_str(), "%d-%d-%d %d:%d:%d",
&TempTimeStruct->tm_year, &TempTimeStruct->tm_mon, &TempTimeStruct->tm_mday,
&TempTimeStruct->tm_hour, &TempTimeStruct->tm_min, &TempTimeStruct->tm_sec);
我尝试过载:
tm& tm::operator=(sql::ResultSet & results)
{
/*CODE*/
return *this;
}
然而VS08报道:
错误C2511:'tm& tm :: operator =(sql :: ResultSet&)':'tm'中找不到重载的成员函数
答案 0 :(得分:1)
struct mytm : public tm {
mytm& operator =(tm const& input) {
/* whatever you want it to do. */
return *this;
};
有些人并不这么认为。我将附上以下警告:
如果你的代码中有大量的tm
项(或任何其他经典的c-lib结构),并且你想要控制它们,那么用这种方式包围一个类就可以了所以。只是做一个三线仿冒品可能不是一个好主意。评论家可能会更喜欢:
struct mytm {
tm the_tm;
/* etc */
};
相反。
答案 1 :(得分:0)
赋值运算符必须是成员函数(在这种情况下为struct tm
),因此执行此操作的唯一方法是修改标准库本身,这是您绝对不应该做的。你当然可以写一个命名的自由函数来做任何你想做的事。
答案 2 :(得分:0)
tm to_tm(sql::ResultSet const& results) {
tm ret;
int r = sscanf(results->getString("StoredAt").c_str(), "%d-%d-%d %d:%d:%d",
&ret->tm_year, &ret->tm_mon, &ret->tm_mday,
&ret->tm_hour, &ret->tm_min, &ret->tm_sec);
if (r != 6) throw std::runtime_error("sscanf: unexpected results");
return ret;
}
void example() {
tm t = to_tm(results);
}