Вот код:Вложенные Классы и 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
}
Идея заключается в том, чтобы сделать компилятор найти F() и г() через ADL.
Однако этот код не скомпилирован с gcc или clang. Похоже, что подобный код компилировался под MSVC.
Возможно, мне что-то не хватает, но я действительно не понимаю, что не так с кодом, и не так ли вообще. Было бы хорошо, если бы кто-то мог пролить свет на этот.
PS. С новым годом :)
Не следует ли также исследовать самое внутреннее пространство имен SomeEnum? – dsi
@dsi, нет, почему вы так думаете? – SergeyA
Я полагался на cppreference.com, который говорит: «4). Для аргументов типа перечисления в набор добавляется пространство имен, в котором определено перечисление. Если тип перечисления является членом класса, этот класс добавляется к набор." – dsi