首页 > 解决方案 > 在匿名命名空间中定义自定义相等运算符

问题描述

我有一个 C 结构(在 C 头文件中),如下所示:

struct Foo {
  int a;
  int b;
  int c;
};
typedef struct Foo Foo;

我想测试这些结构的两个向量的相等性,因此我想为这个结构定义一个自定义相等运算符,仅用于我的翻译单元。

我可以这样做

static inline bool operator==(const Foo&, const Foo&) {...}

但不与

namespace {
    bool operator==(const Foo&, const Foo&) {...}
}

为什么 std::vector 的相等模板找不到这个运算符,有没有比在全局命名空间中扔静态内联更好的方法?

标签: c++c++17

解决方案


我想你会发现std::vector实际上确实在匿名命名空间中找到了该运算符,如果该运算符的声明出现在#include <vector>.

它在您的代码中找不到它的原因与模板函数中名称的两阶段查找有关。第一阶段在范围内的所有命名空间中查找候选者。第二阶段仅查找从属名称。正如短语所说,搜索包含类型的名称空间的“参数相关查找”是依赖的。匿名命名空间中的查找是不依赖的,因此不会在第二阶段完成。

也可以看看:


推荐阅读