重载赋值运算符,用于将sql :: ResultSet赋值给struct tm

时间:2010-04-04 21:31:51

标签: c++ operator-overloading variable-assignment

是否存在不能使赋值运算符重载的类型的异常?

具体来说,我想重载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'中找不到重载的成员函数

3 个答案:

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