看板 C_and_CPP 關於我們 聯絡資訊
※ [本文轉錄自 Programming 看板] 請教各位程式設計的高手們, 我寫c++的時候,遇到物件使用上的問題, 以下是我的code以及vc6與gnu c++的compile之錯誤訊息 class src { public: src() { } }; class ic: public src { public: ic(src& s) { } }; class mpd: public src { public: mpd() { } mpd(src& a) { } mpd(src& a, int b) { } }; void fun() { ic a(src()); ic b(mpd(a)); ic c(b); } int main(int argc, char* argv[]) { ic a(src()); ic b(mpd(a, 1)); ic c(b); return 0; } 以白話來描述之,則是 我這段code一共有3個角色 src: 物件來源 mpd: 物件來源的一種,繼承於src ic: 物件內容,本身也可為物件來源 其中,物件內容(ic)可由物件來源(src)建構 ic::ic(src& s) 當然,mpd也是src的一種,因此物件內容 也可以由mpd來建構,例如 mpd m; ic a(m); // works well 亦可由ic本身來建構(since ic extends src) mpd m; ic a(m); ic b(a); // still works well mpd可由兩種方式建構, 一種是傳入一個src,另一種是傳入一個src和一個整數 mpd::mpd(src& a); mpd::mpd(src& a, int b); 因此以下的code可以正確編譯 src s; mpd m(s); ic a(m); ic b(a); 但是重點在於,我將上述的code 轉換成 src s; ic a(mpd(s)); ic b(a); 的時候卻會出現以下的錯誤訊息: error C2664: '__thiscall ic::ic(class src &)' : cannot convert parameter 1 from 'class ic (class mpd)' to 'class src &' Context does not allow for disambiguation of overloaded function 以gnu c++的compiler則出現 a.cpp: In function `int main(int, char**)': a.cpp:28: no matching function for call to `ic::ic(ic (&)(mpd))' a.cpp:10: candidates are: ic::ic(const ic&) a.cpp:13: ic::ic(src&) 但是若換成mpd當中的傳入兩個參數的constructor卻能夠compile 也就是 src s; ic a(mpd(s, 1)); ic b(a); 我覺得相當困惑,為何會有這樣的現象 麻煩各位高手若可以的話, 請提出您的看法,感激不盡!! mips 敬上 ※ 編輯: mips 來自: 140.113.241.36 (02/08 19:58)
godfat:難倒我了…不過如果不用暫時物件就不會有錯誤了, 02/08 21:45
godfat:也許暫時物件的型別還有特別規則吧 02/08 21:46
UNARYvvv:temp object => const object 就這樣 02/09 02:32