iota函数以前在<algorithm>头中。它已经变成了<numeric>。
我需要保留旧的向后兼容性方式,因此我想使用预处理器选项来选择要包含的正确的标头。
这是什么时候改变的,我应该使用哪个预处理选项?
发布于 2017-03-22 20:10:19
iota从来没有从<algorithm>被“移走”过。C++03在任何标头中都没有std::iota,并且没有符合的实现可以提供它,因为iota不是一个保留的名称,这是工作所必需的:
#define iota arbitrary preprocessing token sequence like this and *that and "!" and \
-13833rfa231fn7or.other.line.noise.that.happens.to.be.a.pp.number
#include <every-standard-header-here>它是在<numeric> in C++11中添加的,也是SGI STL's <numeric>中的一个扩展,它从未出现在<algorithm>中,因此不可能从<algorithm>中移出。
现在,由于允许标准库头以任意方式相互包含,GCC <= 5在C++11模式下的<algorithm>按偶然性包含<random>,而在偶然中包含<numeric>。这仅仅是一个不应该依赖的实现细节,GCC 6不再这样做了。修复方法是简单地包含正确的标头,它是,而且一直是<numeric>。
发布于 2017-03-22 18:34:36
您要做的是检查__cplusplus变量是否在某个点以下,如果不是#include <algorithm>,则检查#include <numeric>
#if __cplusplus <= 199711L
#include <algorithm>
#else
#include <numeric>
#endif这应该适用于您需要使用的任何库,只需注意,您可能必须将199711L更改为适当的编号。
https://stackoverflow.com/questions/42959812
复制相似问题