You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++将友元函数comp传入set_intersection在VS2019报未定义原因求解

你遇到的编译错误本质是C++的友元函数名字查找规则导致的,具体逻辑如下:

  • 在类内部定义的友元函数,虽然属于类所在的外围命名空间(这里是全局命名空间),但类内的友元定义不会将函数声明注入到外围命名空间中,只有在类外部额外声明过该函数,普通的非限定名字查找才能找到它。
  • 你在调用set_intersection时直接传入comp,属于普通非限定名字查找,此时全局域没有comp的可见声明,编译器自然会报“标识符未定义”的错误。
  • 而operator<能正常工作的原因是,运算符调用会触发ADL(参数依赖查找):编译器会根据参数的类型Test,自动到Test的类域中查找对应的运算符重载,所以哪怕没有在全局显式声明operator<也能找到。

解决办法

你可以选以下任意一种方案修复:

  1. 在类外部补充comp的全局声明
    在Test类定义之后、main函数之前加一行声明:
bool comp(const Test& A, const Test& B);
  1. 把comp的实现移到类外部
    类内部只保留友元声明,实现写到类外的全局域:
class Test {
    friend bool comp(const Test& A, const Test& B);
public: 
    int a{ 10 };
};

bool comp(const Test& A, const Test& B) { 
    return A.a < B.a; 
}
  1. 使用Lambda代替独立的比较函数
    C++11及以上版本可以直接传匿名Lambda作为比较参数,不需要额外定义友元函数:
set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(rs),
    [](const Test& a, const Test& b) { return a.a < b.a; });

内容的提问来源于stack exchange,提问作者Neymar87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:09:03