[問題] forward declaration

看板C_and_CPP作者時間10年前 (2014/05/02 23:15), 編輯推噓4(4013)
留言17則, 8人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): Complie Error 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): strcut A incomplete type 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> using namespace std; struct A; void fun(A a){ a(); } struct A{ void operator()(){cout << "A() called" << endl;} }; int main(){ fun(A()); return 0; } 補充說明(Supplement): 這是一題測驗題目 如果將fun寫到struct A後面即可compile正確 請問有什麼方式在不更改code順序 也不更改main以及struct A的前提下 只能更改fun本身以及之前的code 可以避免incomplete type? 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.85.51 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1399043710.A.0F2.html

05/02 23:42, , 1F
A&
05/02 23:42, 1F

05/03 00:02, , 2F
http://ideone.com/9CE1Gj 只能開兩個檔案
05/03 00:02, 2F

05/03 00:02, , 3F
要對A做任何操作一定要先看過他有哪些成員
05/03 00:02, 3F

05/03 02:09, , 4F
http://ideone.com/aQ56yY 把fun改成template
05/03 02:09, 4F

05/03 07:11, , 5F
除了template 你也可以fun的A改成傳入A的abstract父類別的ref
05/03 07:11, 5F

05/03 07:13, , 6F
erence 並把此父類別定義式寫在fun的上面.
05/03 07:13, 6F

05/03 12:30, , 7F
void fun(A *a) 這樣不行嗎?
05/03 12:30, 7F

05/03 15:19, , 8F
用指標的話要修改 main, 題目說不行
05/03 15:19, 8F

05/03 17:01, , 9F
依目前的定義式順序, 不管是A&或是A*都不行, 因為fun()裡有呼
05/03 17:01, 9F

05/03 17:02, , 10F
叫到operator().
05/03 17:02, 10F

05/03 18:18, , 11F
看來看去,使用template好像是唯一解了!
05/03 18:18, 11F

05/04 10:20, , 12F
用template真是我想都沒想過得方法 不太清楚可行的原因
05/04 10:20, 12F

05/04 10:21, , 13F
謝謝各位參與討論
05/04 10:21, 13F

05/04 12:19, , 14F
因為用template是編譯到main裡的fun(A())時才產生fun, 這時A
05/04 12:19, 14F

05/04 12:19, , 15F
的operator()已定義.
05/04 12:19, 15F

05/04 22:39, , 16F
謝謝樓上大大的解惑
05/04 22:39, 16F

05/09 03:50, , 17F
搞錯了XD
05/09 03:50, 17F
文章代碼(AID): #1JOxP-3o (C_and_CPP)