[問題] c++ 的物件使用一問

看板C_and_CPP (C/C++)作者 (天行者路克好帥)時間19年前 (2006/02/08 19:58), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串1/3 (看更多)
※ [本文轉錄自 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)

02/08 21:45, , 1F
難倒我了…不過如果不用暫時物件就不會有錯誤了,
02/08 21:45, 1F

02/08 21:46, , 2F
也許暫時物件的型別還有特別規則吧
02/08 21:46, 2F

02/09 02:32, , 3F
temp object => const object 就這樣
02/09 02:32, 3F
文章代碼(AID): #13wTp9oV (C_and_CPP)
文章代碼(AID): #13wTp9oV (C_and_CPP)