Оператор присваивания перегрузки для назначения sql :: ResultSet для структуры tm - PullRequest
0 голосов
/ 05 апреля 2010

Существуют ли исключения для типов, в которых не может быть перегружен оператор присваивания?

В частности, я хочу перегрузить оператор присваивания 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 ]

1 голос
/ 05 апреля 2010
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 */
};

Вместо.

0 голосов
/ 05 апреля 2010
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);
}
0 голосов
/ 05 апреля 2010

Оператор присваивания должен быть функцией-членом (в данном случае struct tm), поэтому единственный способ сделать это - изменить саму стандартную библиотеку, чего вам определенно не следует делать. Конечно, вы можете написать именованную свободную функцию, чтобы делать все, что вы хотите.

...