在匿名名称空间中定义自定义相等运算符

时间:2019-03-28 04:38:25

标签: c++ c++17

我有一个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的相等模板找不到此运算符,并且有比在全局命名空间中插入静态内联更好的方法吗?

2 个答案:

答案 0 :(得分:6)

我想您会发现student_homepage(request) user_dictionary = check_user(request) if user_dict['role'] == 'STUDENT' return render(request, student_homepage.html, user_dictionary) else if role is staff return render(request, staff/errorpage.html, user_dictionary) else if role is lecturer return render(request, lecturer/errorpage.html, user_dictionary) 实际上是 在匿名命名空间中找到了运算符,如果该运算符的声明出现在std::vector之前。

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

另请参阅:

答案 1 :(得分:2)

首先要注意的是,匿名namespace与否namespace是不同的。

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

真的很像

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

using ANameUniqueToTheFile;

不利之处在于该语言无法让您获得namespace的名称。

因此,使用ADL找不到匿名operator==中定义的namespace函数。


我明白了您为什么要将operator==函数放在namespace中的原因。一种可能的方法是在命名为#include内的struct .h文件中定义namespace

FooWrapper.h:

namespace MyApp
{
   #include "foo.h"

   // Declare the function.
   bool operator==(Foo const& lhs, Foo const& rhs);
}

FooWrapper.cpp

#include "FooWrapper.h"

namespace MyApp
{
   // Implement the function.
   bool operator==(Foo const& lhs, Foo const& rhs) { ... }
}

但是...

我意识到我正在简化“ foo.h”中的内容。将它们全部添加到namesapce MyApp中可能不合适,尤其是在“ foo.h”包括其他.h文件和/或标准头文件的情况下。我希望它能为您提供一些有关如何解决该问题的想法。

如果将所有“ foo.h”放入namespace MyApp的操作不顺利,则可能最好在全局范围内定义operato==函数。