由于未在标头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
,也不会显示警告。
我的问题是,为什么我没有收到适当的错误消息?
答案 0 :(得分:5)
为什么我没有收到适当的错误消息?
因为您用于编译的标准库头文件<algorithm>
或<vector>
中的一个确实包含<numeric>
本身。这是一个常见的可移植性问题。您的代码碰巧可以使用特定的标准库实现进行编译,但是无法使用另一种实现进行编译。库实现可以免费在标准标头中包含标准标头。也许您的<algorithm>
中的某些功能是使用任何<numeric>
算法来实现的。
您遇到的编译器错误是诸如include-what-you-use之类的工具存在的原因。她使用iwyu
会将#include <numeric>
添加到您的代码段中。还要注意,没有警告标志将影响编译结果。要么得到一个硬编译错误,要么什么都没有。