c++ - 为什么编译器不查看类的完整定义?

标签 c++

代码:这个有效

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;} 编译器抛出错误提示

enter image description here

如果类是前向声明的,为什么编译器不查看类的完整定义并找到类的每个成员的定义,这样程序员就不必在外部某处显式定义成员?

是什么阻止了编译器这样做?

最佳答案

在您尝试将数字转换为 smallDOUBLE 时,除了知道它是一个类外,我们对该类一无所知。

就编译器所知,可能没有任何相关的构造函数来完成这项工作。

那么,当编译器最终遇到 smallDOUBLE 类定义时,为什么它不只是让这个问题悬而未决并填充适当的代码呢?或者再检查一遍源代码?好吧,一方面,该定义可能在不同的翻译单元中,然后需要在链接时生成代码,这在今天并非闻所未闻(例如考虑全局优化),但 C 和 C++ 设计为不需要。这不仅仅是一个技术问题。如果它完成了,那么在链接时间之前您将不会收到任何真正的错误消息(哦,我终于发现没有合适的构造函数)。

关于c++ - 为什么编译器不查看类的完整定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840783/

相关文章:

c++ - 在 pybind11 中包装可变参数模板

C++ - 在映射或 vector 中插入时出现段错误

c++ - 使用文本处理文件

c# - Protocol Buffer ,让 C# 与 C++ 对话 : type issues and schema issues

c++ - 斜率为 0 时除以零错误

c++ - 什么是 boost::optional 效率?

c++ - 构建时 Windows C++ __imp 引用错误

c++ - 如何在自定义格式化函数中使用 boost::log::expressions::format_date_time?

c++ - 什么时候应该使用this->?

c++ - C++ curl如何使用?