C++报错:无法用void类型右值初始化bool类型变量
错误原因及解决方案
错误根源
你在InvoiceClass.cpp的add方法中写了:
bool add = lineItem.add(oneLine); //Error here//
但查看ArrayListClass.h里add方法的声明:
void add(LineItemClass item);
add方法的返回类型是void(无返回值),你却试图把它的返回值赋值给bool类型变量,这直接触发编译器报错:无法用void类型的右值初始化bool类型的变量。
解决方案
根据需求选择以下两种处理方式:
方式1:移除不必要的bool变量
如果add方法不需要返回添加状态,直接调用即可,无需接收返回值:
void InvoiceClass::add(int quantity, ProductClass product){ LineItemClass oneLine = LineItemClass(product,quantity); lineItem.add(oneLine); // 直接调用add方法,去掉bool变量 }
方式2:修改ArrayList的add方法返回bool类型
如果需要判断元素是否成功添加(比如索引合法性、扩容是否成功等),可以调整ArrayList的add方法:
- 修改
ArrayListClass.h中的方法声明:
// 将void改为bool bool add(LineItemClass item); bool add(int index, LineItemClass item);
- 修改
ArrayList.cpp中的方法实现(同时修正原循环逻辑的错误):
template <class LineItemClass> bool ArrayList<LineItemClass>::add( LineItemClass item){ if(needToResize()) resize(); data[listSize] = item; listSize ++; return true; // 返回添加成功状态 } template <class LineItemClass> bool ArrayList<LineItemClass>::add(int index, LineItemClass item){ // 新增索引合法性检查 if(index < 0 || index > listSize){ return false; // 索引非法,返回失败 } if (needToResize()) resize(); // 修正循环:从末尾元素开始向后移动,避免覆盖 for(int i = listSize; i > index; i--){ data[i] = data[i-1]; } data[index] = item; listSize ++; return true; // 返回添加成功状态 }
- 此时可在
InvoiceClass.cpp中正常接收返回值:
void InvoiceClass::add(int quantity, ProductClass product){ LineItemClass oneLine = LineItemClass(product,quantity); bool isAdded = lineItem.add(oneLine); // 可根据isAdded的值做后续处理,比如日志输出或错误提示 }
内容的提问来源于stack exchange,提问作者Mohammed Haidous
相关产品推荐
相关产品推荐

