C++将友元函数comp传入set_intersection在VS2019报未定义原因求解
你遇到的编译错误本质是C++的友元函数名字查找规则导致的,具体逻辑如下:
- 在类内部定义的友元函数,虽然属于类所在的外围命名空间(这里是全局命名空间),但类内的友元定义不会将函数声明注入到外围命名空间中,只有在类外部额外声明过该函数,普通的非限定名字查找才能找到它。
- 你在调用
set_intersection时直接传入comp,属于普通非限定名字查找,此时全局域没有comp的可见声明,编译器自然会报“标识符未定义”的错误。 - 而
operator<能正常工作的原因是,运算符调用会触发ADL(参数依赖查找):编译器会根据参数的类型Test,自动到Test的类域中查找对应的运算符重载,所以哪怕没有在全局显式声明operator<也能找到。
解决办法
你可以选以下任意一种方案修复:
- 在类外部补充
comp的全局声明
在Test类定义之后、main函数之前加一行声明:
bool comp(const Test& A, const Test& B);
- 把
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; }
- 使用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
相关产品推荐
相关产品推荐

