编译C++代码时出现异常错误:STL模板实例化报错求助
解决C++编译时
__gnu_cxx::__ops::_Iter_pred实例化错误 嘿,这个报错我之前也踩过坑,大概率是你在用STL算法(比如std::find_if、std::remove_if这类需要谓词的工具)时,谓词的参数类型和迭代器指向的类型不匹配导致的。从报错里的迭代器类型__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<...>能看出来,你的容器应该是std::vector<std::string*>——也就是存的是字符串指针,但你的谓词函数或者lambda没处理对这个类型。
给你几个排查方向:
- 检查谓词的参数类型:如果是用lambda,别想当然写
const string&,因为迭代器指向的是string*,参数得是const string*或者string*才行。举个反例和正例:
错误写法(参数类型不匹配):
正确写法(匹配指针类型,还加了空指针判断避免崩溃):std::vector<std::string*> str_vec; auto it = std::find_if(str_vec.begin(), str_vec.end(), [](const std::string& s) { return s == "target"; });std::vector<std::string*> str_vec; auto it = std::find_if(str_vec.begin(), str_vec.end(), [](const std::string* s) { return s != nullptr && *s == "target"; }); - 确认谓词返回值是bool:有时候不小心让谓词返回了
int或者其他非布尔类型,编译器在实例化模板时就会炸锅,一定要保证谓词的返回值是布尔类型。 - 检查头文件是否齐全:虽然报错出在系统头文件里,但如果你的代码漏了
#include <algorithm>、#include <string>这类必要头文件,也可能导致模板实例化失败。
要是还搞不定,把你proj08_main.cpp里用到相关STL算法的代码片段贴出来,我帮你再瞅一眼~
内容的提问来源于stack exchange,提问作者malaria
相关产品推荐
相关产品推荐

