我从codeproject下载了一个旧项目(2008),现在我正在尝试编译它,结果我遇到了这样的错误:
'&&': illegal, right operand has type 'void'
在这里:
while( hItem_i )
{
PINodeData pNodeData = GetItemData( hItem_i );
pNodeData && pNodeData->DeleteNodeData() && delete pNodeData; //HERE!!!
....
}
出了什么问题?
答案 0 :(得分:6)
错误告诉你问题。 delete
不会返回任何内容(并且它很可能DeleteNodeData
也没有),因此它不能用作测试的一部分(因为测试必须有结果,即使你不使用它。)
将其更改为:
if (pNodeData) {
pNodeData->DeleteNodeData();
delete pNodeData;
}
这是这里的实际逻辑(如果你有一个指针,清理它)。
答案 1 :(得分:4)
当pNodeData
为nullptr
时,您下载了使用短路黑客跳过操作的代码。遗憾的是,这已被破坏,因为delete
运算符的结果类型为void
。它可能在过去通过利用编译器的缺点而起作用,但它始终是非标准的,应该避免使用。
您应该按如下方式重写代码:
if (pNodeData) {
pNodeData->DeleteNodeData();
delete pNodeData;
}
答案 2 :(得分:3)
我认为这不是有效的c ++。它可能在某些时候起作用,因为编译器通常会允许非标准行为。删除不会返回任何内容,因此它可以如何工作和&&需要两个可转换为bool的值的表达式。为什么不把它改成这样的......
if(pNodeData)
{
pNodeData->DeleteNodeData();
delete pNodeData;
}
答案 3 :(得分:3)
delete pNodeData
是一个void
类型的表达式,因此它不能用作&&
的参数。
假设pNodeData->DeleteNodeData()
也是void
类型(根据其名称来判断),请考虑重构
if (PINodeData pNodeData = GetItemData(hItem_i)){
pNodeData->DeleteNodeData();
delete pNodeData;
}
请注意if
条件中的声明:这在新的C ++标准中是允许的。
以前的编译器可能会错误地发出原始代码,但这从未成为标准C ++的一部分。
答案 4 :(得分:2)
关键字delete
返回void
。
您正在使用bool
评估void
表达式。只有那里可以返回true
或false
的表达式。
有关delete
访问http://www.cplusplus.com/reference/new/operator%20delete/
答案 5 :(得分:1)
虽然if
肯定更好,但可以使用&&
:
pNodeData && pNodeData->DeleteNodeData() && (delete pNodeData, 1);