C++ Duration类<<运算符未定义引用错误及实现求助
解决C++ Duration类的operator<<链接错误与正确实现
错误原因
你遇到的「undefined reference to operator<<(std::ostream&, Duration&)」是链接错误,核心原因是编译时只编译了main.cpp,没有包含实现operator<<的源文件,导致链接器找不到函数的具体定义。
另外原代码的operator<<参数设计存在问题:输出操作不应该修改Duration对象,所以参数应该用const Duration&,否则无法输出const对象或临时对象。
修正步骤
编译时包含所有源文件
假设你的代码分别对应三个文件:duration.hpp(头文件)、duration.cpp(operator<<实现)、main.cpp(主函数),编译时需要把所有源文件一起编译,比如使用g++命令:g++ main.cpp duration.cpp -o duration_test修改operator<<的参数为const引用
在头文件和实现文件中,都要把第二个参数改成const Duration&,既符合const正确性,也能适配更多输出场景。优化输出格式
原代码直接拼接数字会导致输出混乱(比如d1输出000),可以加入分隔符(如:),让时长格式更易读。
完整修正代码
duration.hpp
#pragma once #include <iostream> class Duration { private: int hours, minutes, seconds; public: Duration() : hours(0), minutes(0), seconds(0) {} Duration(int s) : hours(s / 3600), minutes((s % 3600) / 60), seconds(s % 60) {} int get_s() const { return seconds; } int get_m() const { return minutes; } int get_h() const { return hours; } // 声明时修改参数为const Duration& friend std::ostream& operator<<(std::ostream&, const Duration&); };
duration.cpp
#include "duration.hpp" #include <iostream> // 实现时同样使用const Duration& std::ostream& operator<<(std::ostream& os, const Duration& duration) { // 格式化为hh:mm:ss的形式 os << duration.get_h() << ":" << duration.get_m() << ":" << duration.get_s(); return os; }
main.cpp
#include <iostream> #include "duration.hpp" int main() { Duration d1{}; Duration d2{2222}; std::cout << d1 << std::endl; std::cout << d2 << std::endl; }
运行结果
编译运行后,输出会是:
0:0:0 0:37:2
(2222秒等于0小时37分钟2秒)
内容的提问来源于stack exchange,提问作者tyler99
相关产品推荐
相关产品推荐

