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