OpenVDB错误:Q_FOREACH传递了3个参数,但只接受了2个

OpenVDB error: Q_FOREACH passed 3 arguments, but takes just 2

本文关键字:参数 2个 3个 OpenVDB FOREACH 错误      更新时间:2023-10-16

我刚刚安装了OpenVDB,我正试图从这里编译基本示例(Ubuntu 14.04+QtCreator 3.4.0+GCC_64)。前两个例子运行得很好,但第三个没有——一旦我包含"LevelSetSphere.h",它就会给出一堆错误。最常见的错误是"Q_FOREACH传递了3个参数,但只需要2个",并引用了代码

void foreach(const NodeOp& op, bool threaded = true, size_t grainSize=1)
{
NodeTransformer<NodeOp> transform(op);
transform.run(this->nodeRange(grainSize), threaded);
}

在NodeManager.h中(其他错误指的是OpenVDB的不同文件中的不同代码块)。有人知道我做错了什么吗?

要联合使用QT和OpenVDB,只需在包含OpenVDB.h:之前使用以下预处理器指令

#ifdef foreach
#undef foreach
#endif
#include <openvdb/openvdb.h>
//[...] here foreach is defined by openvdb and there is no foreach QT macro

使用此解决方案,您无法使用QT foreach宏。如果你在C++11 上,你仍然可以使用基于范围的

Andrew Medico是对的。OpenVDB定义了自己的foreach,因此它与Qt不兼容。但是,如果手动重命名OpenVDB中的所有foreach,则可以使其工作。

问题的出现是因为Qt定义了一个Q_FOREACH宏,该宏与'openvdb/util/NodeMask.h'中的foreach方法冲突。要消除此冲突,只需在openvdb和Qt同时包含的位置取消定义此宏。你可以看看这个Github拉取请求https://github.com/JimJam42/OpenVDBViewer/pull/1来获得这个想法。