《C++程序设计原理与实践(第3版)》第5章示例代码编译失败求助
关于《C++程序设计原理与实践(第3版)》计算器示例编译错误的原因分析
你的问题核心是C++类的隐式默认构造函数生成规则在不同代码上下文的差异:
错误根源
- 第3版书中的
Token_stream类大概率包含了必须显式初始化的成员(比如std::istream&这类引用类型,或者const修饰的成员变量)。根据C++标准,当类包含引用、const成员,或者成员类型本身没有默认构造函数时,编译器无法自动生成有效的隐式默认构造函数,会直接将这个默认构造函数标记为删除(对应警告C4623)。 - 你的代码中尝试直接创建
Token_stream对象(比如Token_stream ts;),这会触发对默认构造函数的调用,但该函数已经被删除,因此抛出错误C2280。
- 第3版书中的
为什么原书中代码能编译?
原代码依赖作者提供的PPP.h头文件,这个头文件可能包含了预处理宏、全局对象定义或者对类的扩展声明,间接为Token_stream提供了默认构造函数的支持(比如提前绑定了输入流对象)。当你注释掉PPP.h改用标准库iostream后,这些隐藏的支持消失,必须显式处理成员初始化。你解决方法的合理性
手动添加显式构造函数并在初始化列表中完成成员绑定(比如将引用成员绑定到std::cin),完全符合C++标准要求,这也是第2版代码的处理方式——第2版可能没有依赖PPP.h的隐藏逻辑,而是直接显式定义了构造函数。
举个简单的构造函数示例:
class Token_stream { private: std::istream& input; public: // 显式构造函数,将引用成员绑定到标准输入流 Token_stream() : input(std::cin) {} // 类的其他成员函数... };
内容的提问来源于stack exchange,提问作者user29114374
相关产品推荐
相关产品推荐

