C++ 与';运营商-';使用#omp时

C++ 与';运营商-';使用#omp时,c++,openmp,C++,Openmp,我正在将OpenMP添加到现有代码中,并尝试将下面的for循环并行化。块是在代码中实现的容器。为块容器实现了运算符

我正在将OpenMP添加到现有代码中,并尝试将下面的for循环并行化。块是在代码中实现的容器。为块容器实现了运算符<和+

#pragma omp parallel for // code compiles without this line
for ( Block::iterator it = initValue; it < blockEnd; ++it ) {
  // LOOP BODY
}
如果我去掉pragma,代码编译得很好,因此我确信我的操作符定义是正确的。为什么OpenMP要求在此处实现“操作员-”

编译器:gcc 7.2.1
OpenMP 4.0

OpenMP仅支持s的迭代器循环。显然,
Block::iterator
不满足它,缺少相应的
运算符-


编辑:另一个答案给出了一些关于GCC如何使用
操作符-
的提示。然而,真正的答案仍然是:OpenMP标准要求您实现一个带有所有必需操作的
随机访问迭代器
。注意,这更进一步。如果不这样做,可能会导致您的代码使用特定的GCC版本,而不是其他版本或编译器。

错误消息实际上非常明确地说明了缺少的内容:

“运算符-”不匹配(操作数类型为Block::iterator和 块(迭代器)

尝试使用以下签名实现独立函数:

int operator - ( Block::iterator a, Block::iterator b );
我根据您描述的场景对此进行了模拟,发现它在g++-5.4下工作


为什么OpenMP要求在此处实现“操作员-”

OpenMP根据要执行的线程数将循环划分为多个段。要做到这一点,需要一点数学知识


首先,总工作量有多大?回答:
blockEnd initValue

CV与范围无关。这是关于缺少一个(alos应该包括编译器和选项)的问题。我不是施法者,但我想象他们投票结束,因为我们缺少
Block::iterator
的定义,但我认为这是不相关的。理想情况下,正如祖兰所说,你应该构建一个。这就是关于SO的好问题的组成部分。(好的Q是由这个组成的)你的问题在没有MCVE的情况下很容易回答,但一般来说,这是一个好问题所必需的。MCVE并不意味着提供完整的专有代码。这意味着您需要编写一个特殊的最小代码来重现您的问题。@WorldSEnder答案中没有任何猜测,因为错误信息非常清楚,而实际的问题是为什么需要它。尽管如此,使用MCVE这个问题会更好,因为它可以让答案演示如何修复它,甚至可以显示编译器对代码的处理方式。
int operator - ( Block::iterator a, Block::iterator b );