我有一个C结构(在C头文件中),如下所示:
struct Foo {
int a;
int b;
int c;
};
typedef struct Foo Foo;
Run Code Online (Sandbox Code Playgroud)
我想测试这些结构的两个向量的相等性,因此我想为我的翻译单元为此结构定义一个自定义的相等运算符。
我能够做到
static inline bool operator==(const Foo&, const Foo&) {...}
Run Code Online (Sandbox Code Playgroud)
但不是
namespace {
bool operator==(const Foo&, const Foo&) {...}
}
Run Code Online (Sandbox Code Playgroud)
为什么std :: vector的相等模板找不到该运算符,并且有比在全局名称空间中插入静态内联更好的方法吗?
我想您会发现,如果该运算符的声明在之前发生,则std::vector实际上会在匿名名称空间中找到该运算符#include <vector>。
在代码中找不到它的原因与模板函数中名称的两阶段查找有关。第一阶段在范围内的所有命名空间中查找候选对象。第二阶段仅查找从属名称。就像短语所说的那样,搜索包含类型的名称空间的“依赖于参数的查找”是依赖的。匿名名称空间中的查找不依赖,因此不会在第二阶段完成。
也可以看看: