这是代码:
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 下编译得很好。
也许我错过了一些东西,但我真的不明白代码有什么问题,以及它是否完全错误。如果有人能阐明这一点,那就太好了。
附言。新年快乐:)
SomeEnum 不是 L1 的成员,因此 ADL 找不到 L1 中定义的函数。
我相信,这就是您正在寻找的报价:
首先在类或类模板 X 中的友元声明中声明的名称将成为 X 的最内层封闭命名空间的成员,但无法进行查找(考虑 X 的参数相关查找除外),除非命名空间范围内的匹配声明是提供 - 有关详细信息,请参阅名称空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)