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