[问题] 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