VS2008转VS2017遇error C2039: 'bind2nd'非std成员求解决
解决VS2017中
std::bind2nd不存在的编译错误 这个问题的核心原因很明确:std::bind2nd在C++17标准中已经被正式移除,而VS2017默认会使用C17(或至少是C14以上)的标准编译代码,所以原本在VS2008(基于C++98标准)中可行的写法就会触发报错。下面给你几个实用的解决思路:
1. 用Lambda表达式替代(最推荐)
Lambda是C11引入的特性,可读性和灵活性远胜于bind2nd,也是现代C的首选写法。举个实际代码的例子:
// 旧代码:使用bind2nd绑定greater的第二个参数 auto it = std::find_if(myVec.begin(), myVec.end(), std::bind2nd(std::greater<int>(), 100));
直接改成Lambda版本,逻辑一目了然:
// 新代码:用Lambda实现相同判断逻辑 auto it = std::find_if(myVec.begin(), myVec.end(), [](int val) { return val > 100; });
这种写法不仅清晰易懂,编译器还能更好地做优化,后续代码维护成本也更低。
2. 用std::bind替代
如果你更倾向于保留绑定式的写法,可以用C++11引入的std::bind(需要包含头文件<functional>),配合占位符std::placeholders::_1实现:
#include <functional> // 新代码:用std::bind替代bind2nd using namespace std::placeholders; // 简化占位符的写法 auto it = std::find_if(myVec.begin(), myVec.end(), std::bind(std::greater<int>(), _1, 100));
这里的_1代表Lambda里的第一个参数,对应find_if迭代出来的每个容器元素。
3. 临时降低项目C++标准版本(不推荐,仅应急用)
如果不想大面积修改代码,可以暂时把项目的C标准降到C14或更早版本(bind2nd在C++14中被标记为废弃,但仍可使用)。操作步骤:
- 右键你的VS2017项目 → 选择「属性」
- 依次展开「配置属性」→「C/C++」→「语言」
- 在「C标准」下拉菜单中选择「ISO C14 标准(/std:c++14)」或者更低版本
不过这个方法只是权宜之计,长远来看还是建议迁移到现代C++写法,避免后续升级编译器再出现类似兼容性问题。
内容的提问来源于stack exchange,提问作者Sam Carleton
相关产品推荐
相关产品推荐

