std::vector 的比较运算符无法找到 T 的比较运算符

2023-12-20

以下非常简单的代码将无法编译

#include <vector>
#include <string>


namespace Foobar {
    struct Test {
        std::string f;
        std::uint16_t uuid;
    };
}

bool operator==(const Foobar::Test& lhs, const Foobar::Test& rhs){
    return lhs.f == rhs.f && lhs.uuid == rhs.uuid;
}


int main(){

    std::vector<Foobar::Test> a;
    std::vector<Foobar::Test> b;

    if(a==b){

    }

    return 0;
}

https://godbolt.org/g/zn6UgJ https://godbolt.org/g/zn6UgJ

不会在我拥有的任何编译器中编译。

虽然以下

#include <vector>
#include <string>


namespace Foobar {
    struct Test {
        std::string f;
        std::uint16_t uuid;
    };

    bool operator==(const Foobar::Test& lhs, const Foobar::Test& rhs){
        return lhs.f == rhs.f && lhs.uuid == rhs.uuid;
    }
}



int main(){

    std::vector<Foobar::Test> a;
    std::vector<Foobar::Test> b;

    if(a==b){

    }

    return 0;
}

https://godbolt.org/g/o4pc1b https://godbolt.org/g/o4pc1b

编译得很好,这让我想std::vector<T>比较运算符在以下名称空间中查找T,为什么它不考虑全局命名空间?


普通的非限定名称查找开始在使用名称的上下文中查找,并沿着封闭范围链向上查找。它停止在包含匹配名称的最嵌套范围内。即使后来确定由此找到的名称不合适(例如,函数重载对于给定调用不可行;或者成员函数不可访问),情况也是如此。

这里,查找的上下文是std::operator==(vector, vector),所以它开始在命名空间中查找std。有大量的超载operator==在命名空间中std,因此普通查找就在那里停止,永远不会到达全局命名空间。

在第二个示例中,通过依赖于参数的查找来找到重载。除了非限定查找之外,此查找还专门针对函数调用中的函数名称执行,并在与调用参数类型关联的作用域中查找名称。在示例中,命名空间Foobar与....关联Foobar::Test,因此依赖于参数的查找搜索该名称空间并找到Foobar::operator==.

因此,自由函数在逻辑上是类公共接口的一部分 - 例如重载运算符 - 通常应在与类本身相同的命名空间中定义,以使参数相关的查找有机会工作。std::operator==(vector, vector)就是一个很好的例子 -a==b在您的示例中,通过依赖于参数的查找方式工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::vector 的比较运算符无法找到 T 的比较运算符 的相关文章

随机推荐

  • ggplot:轴不在原点相交

    我正在尝试使用绘制以下向量ggplot library ggplot2 vec c 44 55 47 81 40 28 44 32 53 57 45 68 52 02 44 27 33 44 41 16 by c 1994 04 30 19
  • 尝试从 Account 获取AuthToken 时如何摆脱 java.lang.IllegalStateException

    我正在尝试获取authToken对于一个帐户但出现此错误 java lang IllegalStateException calling this from your main thread can lead to deadlock 这就是
  • 为什么没有多对多关系?

    我是第一次学习数据库和SQL 在我正在阅读的文本 Oracle 11g Joan Casteel 的 SQL 中 它说 关系数据库中不能存在多对多关系 我明白我们要避免它们 我也明白如何创建一个桥接实体来消除它们 但我试图完全理解 不可能存
  • JDBC 连接字符串语法和剖析

    多年来我使用 JDBC 连接到许多不同的关系系统 H2 HSQLDB MySQL Oracle Postgres 等 在每种情况下 每个系统seems有自己的连接字符串语法风格 我无法想象像 JDBC 这样历史悠久的 APIwouldn t
  • PHP-SQL:上传的图像显示为垃圾文本[重复]

    这个问题在这里已经有答案了 我已通过 phpMyAdmin 将图像和文本直接上传到我的表格 然而 在显示时 图像显示为垃圾文本 可能是什么问题 该图像是一个相对较小的 jpg 文件 这是代码
  • 在列表上使用条件 lambda 语句和 foreach 操作

    为什么我不能做这样的事情 如果我有一个List
  • 从Python字符串中删除大写字母[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想弄清楚如何使用Python从字符串中删除大写字母 但没有for loop 我试图在使用遍历列表时执行此操作while loop 那
  • 如何手动下载brew包进行安装?

    在中国意味着有时你无法通过brew升级来升级brew包 它会遇到这样的错误 curl 35 LibreSSL SSL connect SSL ERROR SYSCALL in connection to cli assets heroku
  • 简单的ajax调用似乎被阻塞

    非常简单的问题 我尝试测试我正在开发的 Restful Web 服务 并进行这个简单的 ajax 调用 使用 jquery
  • LINQ - 用distinct和orderby编写查询

    我对 LINQ 还很陌生 假设我有下表 Incident ID DeviceID Time Info 1 1 5 2 2009 d 2 2 5 3 2009 c 3 2 5 4 2009 b 4 1 5 5 2009 a 在 LINQ 中
  • 在 Dev-C++ 中的 GCC 内联汇编中定义字节(Windows 上 AT&T 语法中的 .ascii)

    下面的代码只是在屏幕上显示一个消息框 地址被硬编码以方便 int main asm xorl eax eax n xorl ebx ebx n xorl ecx ecx n xorl edx edx n pushl ecx n 0x0 pu
  • QObject 无法为位于不同线程中的父级创建子级

    您好 需要从后台进行一些套接字通信 我使用过QtConcurrent run对此 但给我警告 QObject Cannot create children for a parent that is in a different thread
  • 在非开发层预览邮件程序

    我在下面有几个邮件预览spec mailer previews On development我可以查看下面的所有预览 rails mailers 但是默认情况下 其他环境中不存在此功能 我想在staging环境并排队这篇文章在这里 http
  • Android中的缩放、旋转和平移操作后如何获取相对于Parent的View位置?

    我正在开发一项功能 其中包括图像缩放 旋转和平移操作 所有这些操作对我来说都运行良好 现在 我需要检查相对于父级的视图位置 我开发了以下代码来获取缩放和翻译后的视图位置 private fun findViewPosition view V
  • 如何在react.js中递归渲染子组件

    我想从其自己的组件中递归添加一个反应组件 我看到了这个例子这是通过子 TreeNodes 进行映射并以相同的方式添加子节点 不幸的是它对我来说根本不起作用 这个想法是有一个简单的评论组件 并且回复将重用相同的组件 var Comment R
  • 是否可以在 MatLab 中使用 .NET 应用程序?

    我对 C 感觉很熟悉 我将设计一个控制台应用程序 该应用程序将从 Web 服务中获取一些数据 我想让一组科学家使用 MatLab 中的数据 实现此目的的一种方法是将其存储在 HDD 上的文件中 然后将其内容加载到 MatLab 中 但这让我
  • getJSON 回调未触发

    我正在通过参与一个包括 SubSonic 和 jQuery 的测试项目来学习 asp net mvc 我遇到的问题是 每次我想要返回的不仅仅是简单字符串 例如 Json 对象 时 我都会遇到困难 因为回调似乎不会触发 或者返回失败 我获取数
  • 德语最好的 MySQL 排序规则是什么

    我正在用德语建立一个网站 所以我将使用像 等等 那么您有什么建议呢 这个答案已经过时了 如需完整的表情符号支持 请参阅这个答案 https stackoverflow com a 48325386 2898712 至于字符集 如果可以的话
  • Tibco - 最大流量限制属性

    我有一个启用了最大流量限制的进程 该值设置为 10 它是一个异步进程 用于每天获取数千条消息 我们注意到 在高峰期 随着EMS服务器队列中消息的增加 tibco进程的性能下降 Tibco 的速度缓慢与 EMS 消息流入的增加之间是否存在任何
  • std::vector 的比较运算符无法找到 T 的比较运算符

    以下非常简单的代码将无法编译 include