"非常量引用的初始值必须为左值"this指针无法以引用的形式传递给友元函数

DZGodly 2018-01-02 08:11:25
程序部分代码如下,错误提示如文末图片所示;大佬们求救,下周交作业了! help!!!
typedef class BookTree {
private:
BorrowedBook book;
BookTree* lchild;
BookTree* rchild;
public:
void in();
friend void insert(BookTree*&, string&, bool&);
};
void insert(BookTree*& t,string& id,bool& flag) {
if (flag) return;
if (t != NULL) {
if (t->book.id == id) {
cout << "-----此书已存在,库存+1-----" << endl;
t->book.rest++;
t->book.stock++;
flag = true;
}
else if (t->book.id > id)
insert(t->lchild, id, flag);
else insert(t->rchild, id, flag);
}
else {
t = new BookTree;
cout << "请输入书名:";
cin >> t->book.name; cout << endl;
cout << "请输入作者:";
cin >> t->book.auth; cout << endl;
t->book.rest = 1;
t->book.stock = 1;
cout << "-----存入成功-----" << endl;
flag = true;
}
}

void BookTree::in() {
cout << "请输入书号:";
string id;
cin >> id;
cout << endl;
bool flag = false;
insert(this, id, flag);
}

...全文
456 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2018-01-04
  • 打赏
  • 举报
回复
insert里面改一下就可以了,没必要修改t 指针 else if (t->book.id > id) { if(t->lchild!=NULL) insert(t->lchild, id, flag); else { BookTree * tmp = new BookTree; tmp->....= t->lchild=tmp; } } else{ insert(t->rchild, id, flag); //同理 }
paschen 版主 2018-01-03
  • 打赏
  • 举报
回复
this指针是常量,不能修改,insert函数实际不需要第一个参数
大风哉 2018-01-03
  • 打赏
  • 举报
回复
我觉得this指针是常量不能修改是对的,而在"void insert(BookTree*& t,string& id,bool& flag);"函数签名中对于BookTree*类型变量的引用可能导致对于此变量的改变,所以会报这个错。比如函数外部有这样一个指针变量"BookTree* pTree",传到insert函数中也是这个pTree变量,函数中的t只不过是这个pTree的别名,函数内部可以用这样的语句来改变pTree的值:"t = new BookTree;"。 这报的错确实读着拗口,实际内容应该就是"和this指针作为常量不能修改"这个情况矛盾。 你可以在"void insert(BookTree*& t,string& id,bool& flag);"的BookTree前加上const使这个引用不能被修改:void insert(const BookTree*& t,string& id,bool& flag); 或者不直接传this指针,而是通过一个临时指针变量来传: BookTree* pTemp = (BookTree*)this; insert(pTemp, id, flag);
大风哉 2018-01-03
  • 打赏
  • 举报
回复
我觉得大家回答有点偏题,楼主是想问为什么会出现这个问题的,而不是说怎么去解决这个问题。 解决这个问题是后面一步需要做的。
paschen 版主 2018-01-03
  • 打赏
  • 举报
回复
引用 4 楼 朴实的农民Z的回复:
[quote=引用 2 楼 paschen 的回复:] this指针是常量,不能修改,insert函数实际不需要第一个参数
但是insert函数是一个递归函数,如果不传入this作为参数的话就没办法实现递归功能了啊[/quote] 那你看下这样呢: BookTree* p = (BookTree*)this; insert(p, id, flag);
DZGodly 2018-01-03
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
this指针是常量,不能修改,insert函数实际不需要第一个参数
但是insert函数是一个递归函数,如果不传入this作为参数的话就没办法实现递归功能了啊
DZGodly 2018-01-03
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
去掉引用符号。this的类型Type* const,不能传给Type*& void insert(BookTree*& t,string& id,bool& flag)
去掉&的话,insert函数就不能对this指针指向的内容进行修改了啊
sdghchj 2018-01-02
  • 打赏
  • 举报
回复
去掉引用符号。this的类型Type* const,不能传给Type*& void insert(BookTree*& t,string& id,bool& flag)
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常 35   2.2 变 38   2.2.1 变定义 38   2.2.2 变声明和定义的关系 41   2.2.3 标识符 42   2.2.4 名字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常表达式 58   2.5 处理类型 60   2.5.1 类型别名 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向和数组 73   3.1 命名空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针和数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧