Определение автоматической функции пространства имен с явной областью действия не компилируется ⇐ C++
-
Гость
Определение автоматической функции пространства имен с явной областью действия не компилируется
(Мне очень трудно было придумать название для этой задачи; названия получше приветствуются)
Приняв стиль почти всегда автоматически (AAA) Херба Саттера, я столкнулся с неожиданной ошибкой компиляции при определении свободной функции внутри пространства имен, которая взаимодействует с другим пространством имен.
Учитывайте:
пространство имен baz { класс Летучая мышь {}; } пространство имен foo { класс Бар {}; } пространство имен foo { auto toBat(Bar const&) -> baz::Bat; auto toBar(baz::Bat) -> Бар; } auto foo::toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } auto foo::toBar(baz::Bat) -> Bar { return Bar(); } В моем реальном коде baz предоставляется сторонней библиотекой, foo::Bar находится в одном заголовке, а функции моего адаптера объявлены в другом заголовке , а определения находятся в исходном файле.
Для этого кода GCC 12.2.1 жалуется следующим образом:
/usr/src/project/util/unit/c++_unittest.cpp:64:35: ошибка: 'baz::Bat foo::toBat( Bar)' должен был быть объявлен внутри 'foo' 64 | auto foo::toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } | ^~~ (в моем рабочем коде обе функции выдают одинаковые ошибки. По (другим?) причинам, которые я не понимаю, toBar компилируется здесь) Если вместо этого источник записывается как
пространство имен foo{ auto toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } auto toBar(baz::Bat) -> Bar { return Bar(); } } компилируется нормально.
Очевидно, что-то в автоматическом объявлении не очень хорошо сочетается с пространством имен, но я не понимаю, почему это проблема.
(Мне очень трудно было придумать название для этой задачи; названия получше приветствуются)
Приняв стиль почти всегда автоматически (AAA) Херба Саттера, я столкнулся с неожиданной ошибкой компиляции при определении свободной функции внутри пространства имен, которая взаимодействует с другим пространством имен.
Учитывайте:
пространство имен baz { класс Летучая мышь {}; } пространство имен foo { класс Бар {}; } пространство имен foo { auto toBat(Bar const&) -> baz::Bat; auto toBar(baz::Bat) -> Бар; } auto foo::toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } auto foo::toBar(baz::Bat) -> Bar { return Bar(); } В моем реальном коде baz предоставляется сторонней библиотекой, foo::Bar находится в одном заголовке, а функции моего адаптера объявлены в другом заголовке , а определения находятся в исходном файле.
Для этого кода GCC 12.2.1 жалуется следующим образом:
/usr/src/project/util/unit/c++_unittest.cpp:64:35: ошибка: 'baz::Bat foo::toBat( Bar)' должен был быть объявлен внутри 'foo' 64 | auto foo::toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } | ^~~ (в моем рабочем коде обе функции выдают одинаковые ошибки. По (другим?) причинам, которые я не понимаю, toBar компилируется здесь) Если вместо этого источник записывается как
пространство имен foo{ auto toBat(foo::Bar) -> baz::Bat { return baz::Bat(); } auto toBar(baz::Bat) -> Bar { return Bar(); } } компилируется нормально.
Очевидно, что-то в автоматическом объявлении не очень хорошо сочетается с пространством имен, но я не понимаю, почему это проблема.
Мобильная версия