C++ 使用重载运算符查找()==
我尝试使用重载运算符==()在向量中查找元素。但是,如果在以下代码中使用C++ 使用重载运算符查找()==,c++,operator-overloading,overload-resolution,argument-dependent-lookup,name-lookup,C++,Operator Overloading,Overload Resolution,Argument Dependent Lookup,Name Lookup,我尝试使用重载运算符==()在向量中查找元素。但是,如果在以下代码中使用type1,则输出为1和0(未找到)。使用type2同时给出1和1。环境是Xubuntu 12.04和g++版本4.6.3 #include <iostream> #include <vector> #include <algorithm> using namespace std; typedef pair<string, int> type1; struct type2:
type1
,则输出为1和0(未找到)。使用type2
同时给出1和1。环境是Xubuntu 12.04和g++版本4.6.3
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<string, int> type1;
struct type2: public type1 {};
#define TYPE type1
bool operator== (const TYPE& lhs, const TYPE& rhs) {
return lhs.first == rhs.first;
}
int main()
{
vector<TYPE> vec;
TYPE v1, v2;
v1.first = "abc"; v1.second = 1; vec.push_back(v1);
v2.first = "abc"; v2.second = 2;
cout << (v1 == v2) << endl;
cout << (find(vec.begin(), vec.end(), v2) != vec.end()) << endl;
}
#包括
#包括
#包括
使用名称空间std;
typedef对type1;
结构类型2:公共类型1{};
#定义类型type1
布尔运算符==(常数类型和lhs、常数类型和rhs){
返回lhs.first==rhs.first;
}
int main()
{
向量向量机;
v1、v2型;
v1.first=“abc”;v1.second=1;向量推回(v1);
v2.first=“abc”;v2.second=2;
coutstd::pair
在名称空间std
中有其默认的运算符==
,这是一个用于任意对的模板,比较第一个
和第二个
字段。该运算符在四种情况中的一种情况下被选中,即find
withTYPE==type1
。详细信息有一点虽然复杂:
TYPE==type1
的实际情况是(如果我错了,请纠正我)
- 对于
v1==v2
ADL(依赖于参数的名称查找)用于在std
中查找运算符==
,这意味着此运算符被添加到正常重载集。但是,相对于std
中的模板运算符==
,当前翻译单元中的非模板版本仍然是首选的
std::find
调用在std
中实例化,因此操作符==
的查找直接在std
中开始。它查找一个匹配项(不使用ADL!),因此不搜索包含OP自己操作符的封闭范围
对于TYPE==type2
v1==v2
很简单-它直接在封闭的命名空间中找到运算符==
std::find
也在std
中实例化,但是使用ADL将主作用域中的自定义运算符添加到重载分辨率集中,然后发现它比std
中的运算符更具体
std::pair
有它自己的优先于您自己的。我认为您最好使用而不是find。它需要一个谓词,所以您可以将比较器定义为一个普通函数/函子并传递它。由@AlexanderGessler给出的答案在几个细节上是不完整的。所以让我们为这两个表达式使用编译器这两种类型都有,好吗
表达式1
关于名称空间没有什么好处。但是最重要的是pair
或find
的名称空间吗?据我所知,find
在当前翻译单元中实例化,然后在std::pair
@Nawaz上使用ADL解析运算符==
,那么为什么v1==v2
返回true
在这两种情况下都是正确的?@MarkRansom:你是对的。我有点困惑。我不认为这个答案可以解释这种行为,所以我取消了我的上票,然后又取消了我的下票,因为它不完整。好的一点-一个可能的起点是操作符=
通过ADL找到正常的std::pair
操作符,但仍然使用ne一个原因是非模板比非模板更受欢迎。仍然没有通过find
版本进行解释。感谢您的回复和链接。谢谢。将尝试使用functor作为谓词。花了一些时间理解。感谢您的详细解释。很高兴能够提供帮助!
+---------------------+-----------------+-----------------+
| phase | type1 | type2 |
+---------------------+-----------------+-----------------+
| unqualified lookup | ::operator== | ::operator== |
| ADL | std::operator== | std::operator== |
+---------------------+-----------------+-----------------+
| argument deduction | ::operator== | ::operator== |
| | std::operator== | |
+---------------------+-----------------+-----------------+
| overload resolution | ::operator== | ::operator== |
+---------------------+-----------------+-----------------+
+---------------------+-----------------+-----------------+
| phase | type1 | type2 |
+---------------------+-----------------+-----------------+
| unqualified lookup | std::operator== | std::operator== |
| ADL | | ::operator== |
+---------------------+-----------------+-----------------+
| argument deduction | std::operator== | ::operator== |
+---------------------+-----------------+-----------------+
| overload resolution | std::operator== | ::operator== |
+---------------------+-----------------+-----------------+