嵌套 类 和 ADL
Nested Classes and ADL
代码如下:
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。新年快乐:)
SomeEnum 不是 L1 的成员,所以 ADL 找不到 L1 中定义的函数。
我相信,这是您正在寻找的引述:
A name first declared in a friend declaration within class or class template X becomes a member of the innermost enclosing namespace of X, but is not accessible for lookup (except argument-dependent lookup that considers X) unless a matching declaration at the namespace scope is provided - see namespaces for details.
代码如下:
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。新年快乐:)
SomeEnum 不是 L1 的成员,所以 ADL 找不到 L1 中定义的函数。
我相信,这是您正在寻找的引述:
A name first declared in a friend declaration within class or class template X becomes a member of the innermost enclosing namespace of X, but is not accessible for lookup (except argument-dependent lookup that considers X) unless a matching declaration at the namespace scope is provided - see namespaces for details.