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

调用递归函数写二叉树到文件出现"attempting to reference a deleted function"编译错误

问题根因

你遇到的编译错误和自定义的BinTree、BinNode类的构造/析构函数无关,问题出在标准库文件流的传参规则上。
C++标准库的所有IO流对象(包括std::ofstream)都禁止拷贝操作,它们的拷贝构造函数、拷贝赋值运算符被显式定义为删除函数。你当前的重载writeFile函数是按值接收std::ofstream参数,调用时需要拷贝对外接口中创建的outFS对象,自然触发了「尝试引用已删除函数」的报错。

修复方案

你只需要将writeFile的流参数改为左值引用,避免触发拷贝即可,需要修改两处代码:

  • 修改BinTree.h中私有writeFile函数的声明:
// 原声明
// void writeFile(BinNode<T>* ptr, std::ofstream outFile);
// 修改后
void writeFile(BinNode<T>* ptr, std::ofstream& outFile);
  • 修改BinTree.template中对应writeFile实现的参数定义:
template<typename T>
void BinTree<T>::writeFile(BinNode<T>* ptr, std::ofstream& outFile) {
    if (ptr != nullptr) {
        writeFile(ptr->left, outFile);
        outFile << ptr->data << std::endl;
        writeFile(ptr->right, outFile);
    }
}

修改后全程复用同一个打开的文件流,不会触发拷贝操作,编译错误即可解决,递归写入逻辑也能正常执行。

可选优化点

你当前的readFile实现存在eof()的常见误用问题:while (!inFS.eof())会在读到文件末尾后多执行一次读取操作,可能插入无效值到二叉树中,建议修改为:

while (getline(inFS, temp)) {
    add(temp);
}

内容的提问来源于stack exchange,提问作者Kurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:03