以下是代码:
namespace Namespace
{
struct L0
{
enum SomeEnum
{
EnumVal
};
struct L1
{
friend void f(SomeEnum)
{
std::cout << "f()" << std::endl;
}
};
friend void g(SomeEnum)
{
std::cout << "g()" << std::endl;
}
};
}
int main()
{
f(Namespace::L0::EnumVal); // error: f not defined
g(Namespace::L0::EnumVal); // good
}
这里的想法是让编译器通过ADL找到f()和g()。
但是,此代码无法使用gcc或clang进行编译。类似的代码似乎在MSVC下编译得很好。
也许我会错过一些东西,但我并不能真正理解代码的错误,以及代码是否错误。如果有人能对这一点有所了解,那就太好了。
PS。新年快乐:)
答案 0 :(得分:2)
SomeEnum不是L1的成员,因此ADL找不到L1中定义的函数。
我相信,这是你要找的报价:
在类或类模板X中的友元声明中首先声明的名称成为X的最内层封闭命名空间的成员,但是无法进行查找(除了依赖于参数的查询,除非在此处使用匹配的声明)提供了命名空间范围 - 有关详细信息,请参阅命名空间。