Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用重载运算符查找()==_C++_Operator Overloading_Overload Resolution_Argument Dependent Lookup_Name Lookup - Fatal编程技术网

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;

cout
std::pair
在名称空间
std
中有其默认的
运算符==
,这是一个用于任意对的模板,比较
第一个
第二个
字段。该运算符在四种情况中的一种情况下被选中,即
find
with
TYPE==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== |
+---------------------+-----------------+-----------------+