[問題] forward declaration

作者: keya (Lynch)   2014-05-02 23:15:07
開發平台(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?
謝謝!
作者: carylorrk (carylorrk)   2014-05-02 23:42:00
A&
作者: azureblaze (AzureBlaze)   2014-05-03 00:02:00
http://ideone.com/9CE1Gj 只能開兩個檔案要對A做任何操作一定要先看過他有哪些成員
作者: AstralBrain   2014-05-03 02:09:00
http://ideone.com/aQ56yY 把fun改成template
作者: kwpn (ITSST)   2014-05-03 07:11:00
除了template 你也可以fun的A改成傳入A的abstract父類別的reference 並把此父類別定義式寫在fun的上面.
作者: ah7675 (阿毛)   2014-05-03 12:30:00
void fun(A *a) 這樣不行嗎?
作者: uranusjr (←這人是超級笨蛋)   2014-05-03 15:19:00
用指標的話要修改 main, 題目說不行
作者: kwpn (ITSST)   2014-05-03 17:01:00
依目前的定義式順序, 不管是A&或是A*都不行, 因為fun()裡有呼叫到operator().
作者: tomnelson   2014-05-03 18:18:00
看來看去,使用template好像是唯一解了!
作者: keya (Lynch)   2014-05-04 10:20:00
用template真是我想都沒想過得方法 不太清楚可行的原因謝謝各位參與討論
作者: kwpn (ITSST)   2014-05-04 12:19:00
因為用template是編譯到main裡的fun(A())時才產生fun, 這時A的operator()已定義.
作者: keya (Lynch)   2014-05-04 22:39:00
謝謝樓上大大的解惑
作者: carylorrk (carylorrk)   2014-05-09 03:50:00
搞錯了XD

Links booklink

Contact Us: admin [ a t ] ucptt.com