编译使用std::make_reverse_iterator的C++程序报错:该函数非std成员
解决g++4.9.2下std::make_reverse_iterator编译报错的问题
兄弟,我太懂这种明明按标准文档加了C++14编译选项,却还是报错的憋屈感了!咱们一步步来拆解问题:
问题根源
虽然std::make_reverse_iterator确实是C14标准引入的特性,但**g 4.9.x系列对C14的支持是不完全的**——这个函数直到g 5.0及以上版本才被加入到标准库中。你用的g++4.9.2哪怕指定了-std=c++14,标准库本身也没实现这个函数,所以编译器找不到它。
具体解决思路
1. 升级编译器(最推荐)
直接把g升级到5.1或更高版本,比如g5.1之后就完整支持了C++14的这个特性,升级后再用-std=c++14或-std=c++17编译,问题就能直接解决。
2. 手动实现替代版本
如果暂时没法升级编译器,自己写一个和标准库功能完全一致的make_reverse_iterator模板函数就行,放在你的代码开头(或者头文件里):
#include <iterator> // 必须包含这个头文件,因为要用到std::reverse_iterator template <typename Iterator> std::reverse_iterator<Iterator> make_reverse_iterator(Iterator it) { return std::reverse_iterator<Iterator>(it); }
之后你原来调用std::make_reverse_iterator的代码完全不用改,直接就能用这个自定义版本替代。
3. 直接构造std::reverse_iterator
不想写模板的话,也可以跳过make_reverse_iterator,直接手动构造反向迭代器:
把原来的代码:
auto it = std::make_reverse_iterator(vec.end());
改成:
// 用decltype自动推导迭代器类型 auto it = std::reverse_iterator<decltype(vec.end())>(vec.end()); // 或者显式指定类型,比如vector<int>::iterator auto it = std::reverse_iterator<std::vector<int>::iterator>(vec.end());
这样也能达到同样的效果,绕开对make_reverse_iterator的依赖。
补充验证
你提到的测试代码补全后大概是这样:
#include <iostream> #include <vector> #include <iterator> int main() { std::vector<int> vec = {1,2,3,4,5}; auto it = std::make_reverse_iterator(vec.end()); for (; it != std::make_reverse_iterator(vec.begin()); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
用g++4.9.2执行g++ -std=c++14 test.cpp -o test时,会报类似error: ‘make_reverse_iterator’ is not a member of ‘std’的错误,用上面的任一方法都能解决。
内容的提问来源于stack exchange,提问作者PotatoBoy
相关产品推荐
相关产品推荐

