代码:这个有效
class smallDOUBLE;
class smallINT
{
private:
int val;
public:
smallINT():val(0){}
smallINT(int i):val(i){}
operator smallDOUBLE(); //comment this line
//operator smallDOUBLE(){return val;}
};
class smallDOUBLE
{
private:
double val;
public:
smallDOUBLE():val(0){}
smallDOUBLE(double i):val(i){}
operator smallINT() { return val;}
};
smallINT::operator smallDOUBLE(){return val;} //Comment this line.
int main()
{
smallINT int1(10);
smallDOUBLE DBL1(123.22);
smallINT int2 = DBL1;
smallDOUBLE DBL2 = int1;
}
但是当我评论 smallINT::operator smallDOUBLE(){return val;}
时,operator smallDOUBLE();
并取消注释
operator smallDOUBLE(){return val;}
编译器抛出错误提示
如果类是前向声明的,为什么编译器不查看类的完整定义并找到类的每个成员的定义,这样程序员就不必在外部某处显式定义成员?
是什么阻止了编译器这样做?
最佳答案
在您尝试将数字转换为 smallDOUBLE
时,除了知道它是一个类外,我们对该类一无所知。
就编译器所知,可能没有任何相关的构造函数来完成这项工作。
那么,当编译器最终遇到 smallDOUBLE
类定义时,为什么它不只是让这个问题悬而未决并填充适当的代码呢?或者再检查一遍源代码?好吧,一方面,该定义可能在不同的翻译单元中,然后需要在链接时生成代码,这在今天并非闻所未闻(例如考虑全局优化),但 C 和 C++ 设计为不需要。这不仅仅是一个技术问题。如果它完成了,那么在链接时间之前您将不会收到任何真正的错误消息(哦,我终于发现没有合适的构造函数)。
关于c++ - 为什么编译器不查看类的完整定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840783/