You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Duration类<<运算符未定义引用错误及实现求助

解决C++ Duration类的operator<<链接错误与正确实现

错误原因

你遇到的「undefined reference to operator<<(std::ostream&, Duration&)」是链接错误,核心原因是编译时只编译了main.cpp,没有包含实现operator<<的源文件,导致链接器找不到函数的具体定义。

另外原代码的operator<<参数设计存在问题:输出操作不应该修改Duration对象,所以参数应该用const Duration&,否则无法输出const对象或临时对象。

修正步骤

  1. 编译时包含所有源文件
    假设你的代码分别对应三个文件:duration.hpp(头文件)、duration.cpp(operator<<实现)、main.cpp(主函数),编译时需要把所有源文件一起编译,比如使用g++命令:

    g++ main.cpp duration.cpp -o duration_test
    
  2. 修改operator<<的参数为const引用
    在头文件和实现文件中,都要把第二个参数改成const Duration&,既符合const正确性,也能适配更多输出场景。

  3. 优化输出格式
    原代码直接拼接数字会导致输出混乱(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:07:02