缺少include不会在RedHat 6上产生编译错误

时间:2019-06-27 07:47:00

标签: c++ compiler-errors redhat numeric

由于未在标头numeric中找到std::accumulate,因此无法编译此代码段。

#include <algorithm>
#include <vector>

int main () {
    std::vector<int> vec{ 1, 2, 3, 4 };
    return std::accumulate(vec.begin(), vec.end(),0);
}

compiler explorer给我正确的错误消息

<source>(6): error: namespace "std" has no member "accumulate"
      return std::accumulate(vec.begin(), vec.end(),0);

我正在使用RedHat 6和Intel编译器版本18.0.3。如果使用此设置进行编译,则不会出现错误,并且结果很好。即使使用-Wall,也不会显示警告。

我的问题是,为什么我没有收到适当的错误消息?

1 个答案:

答案 0 :(得分:5)

  

为什么我没有收到适当的错误消息?

因为您用于编译的标准库头文件<algorithm><vector>中的一个确实包含<numeric>本身。这是一个常见的可移植性问题。您的代码碰巧可以使用特定的标准库实现进行编译,但是无法使用另一种实现进行编译。库实现可以免费在标准标头中包含标准标头。也许您的<algorithm>中的某些功能是使用任何<numeric>算法来实现的。

您遇到的编译器错误是诸如include-what-you-use之类的工具存在的原因。她使用iwyu会将#include <numeric>添加到您的代码段中。还要注意,没有警告标志将影响编译结果。要么得到一个硬编译错误,要么什么都没有。