2010-04-04 34 views
0

對於不能賦值操作符重載的類型是否有例外情況?重載賦值操作符用於將sql :: ResultSet賦值給struct tm

具體來說,我想重載struct tm(from 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: :operator =(sql :: ResultSet &)':未在'tm'中找到的重載成員函數

+0

你能繼承tm結構嗎? – pmr 2010-04-04 21:34:21

回答

0

賦值運算符必須是成員函數(在這種情況下爲struct tm),所以唯一的方法是修改標準庫本身,這是你絕對不應該做的。你當然可以寫一個命名的免費函數來做你想做的任何事情。

+0

非常感謝,已經完成了我只想到我嘗試並得到一些額外的任務標記作爲其唯一的地方即時通訊任何類型的任務。 – 2010-04-04 21:36:51

+2

@Luke如果這是爲了學校,我強烈建議你將這個「聰明」引入你的代碼。我想大多數老師會爲此懲罰你。 – 2010-04-04 21:42:02

+0

@Johannes感謝您的支持 – 2010-04-05 09:48:34

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 */ 
}; 

取而代之。

+2

由於任何原因而不好。 – 2010-04-04 21:38:35

+0

好吧,多年來我一直很好用。 Chacun一隻兒子山羊。 – bmargulies 2010-04-04 21:49:20

+0

我可以看到這在某些情況下可能有用。 – 2010-04-05 09:46:36

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); 
} 
+0

@Roger感謝您的錯誤處理提示 – 2010-04-05 09:47:35