Определение автоматической функции пространства имен с явной областью действия не компилируетсяC++

Программы на 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(); } } компилируется нормально.

Очевидно, что-то в автоматическом объявлении не очень хорошо сочетается с пространством имен, но я не понимаю, почему это проблема.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»