【发布时间】:2013-02-21 06:53:32
【问题描述】:
我正在尝试使用 g++ 进行编译,但出现以下错误
if(nmFunctions && nmFunctions->updateAddressResponseHandler)
错误:'operator&&' 不匹配
【问题讨论】:
-
值得引用你的类和 nmFunctions 的声明(基本部分)
标签: c++ operator-keyword
我正在尝试使用 g++ 进行编译,但出现以下错误
if(nmFunctions && nmFunctions->updateAddressResponseHandler)
错误:'operator&&' 不匹配
【问题讨论】:
标签: c++ operator-keyword
我猜updateAddressResponseHandler 是一个函数,你想调用它并检查它的返回值。在这种情况下,您需要调用它:
if(nmFunctions && nmFunctions->updateAddressResponseHandler())
// ^^
如果不是这样,请发布updateAddressResponseHandler 的定义,并描述你想用它做什么。
【讨论】:
"the address of updateAddressResponseHandler will always evaluate as 'true'"。
updateAddressResponseHandler 是一个函数指针。如果它是成员函数,您将再次收到不同的错误(不是警告),因为 nmFunctions->updateAddressResponseHandler 在这种情况下不是有效的表达式。没有更多信息,我们只能猜测是哪种情况。
问题是对象nmFunctions 不能隐式转换为布尔值,或者不知道如何处理&& 运算符。
从-> 我猜它可能是shared_ptr,在这种情况下,您需要将其显式转换为bool - (bool)nmFunctions && ...。
请注意,如果nmFunctions 类具有以下任一功能,那应该可以解决您的问题。 shared_ptr 使用另一个强制显式转换的版本。
为什么首选第一种方式应该很明显。
// allow for "(bool)nmFunctions" or implicit casting
operator bool() { return someBoolean; }
// allow for "nmFunctions && (boolean)"
bool operator&&(bool b) { return b && someBoolean; }
另外,updateAddressResponseHandler 听起来像一个函数名。如果是,则需要将其更改为updateAddressResponseHandler(),否则无法编译。
【讨论】:
class x { public: void (*updateAddressResponseHandler)(void); }; int main(int argc, char **argv) { x *nmFunctions = 0; if(nmFunctions && nmFunctions->updateAddressResponseHandler) { nmFunctions = 0; } return 0; }。 g++ 完美编译。
updateAddressResponseHandler可能是一个函数指针。早些时候我已经要求 OP 澄清这个问题,否则任何猜测他的代码为什么会产生编译错误的尝试都是浪费时间。