Вызов функции, перегруженной в нескольких пространствах имен из одного пространства имен
У меня есть следующий фрагмент кода:
void foo(double a) {}
namespace bar_space
{
struct Bar {};
void foo(Bar a) {}
}
foo (double) - это общая функция из библиотеки. У меня есть свое собственное пространство имен bar_space с моей собственной структурой Bar. Я хотел бы реализовать перегрузку foo() для Bar, что делает Bar более похожим на встроенные типы.
Проблема появляется, когда я пытаюсь вызвать оригинальный foo (double) из пространства имен:
namespace bar_space
{
void baz()
{
foo(5.0); // error: conversion from ‘double’ to non-scalar type ‘ssc::bar_space::Bar’ requested
}
}
Это не скомпилируется на gcc как на моей Fedora, так и на Mac.
призвание
foo(5.0)
извне пространства имен или использования
namespace bar_space
{
::foo(5.0)
}
работает нормально, но это не делает мою новую функцию такой же приятной, как я надеялся (другие разработчики также работают внутри bar_space).
Bar_space скрывает оригинальную функцию? Есть ли способ сделать вызываемый foo(5.0) изнутри bar_space без явного определения области видимости (::)? Любая помощь приветствуется.
3 ответа
В C++ существует концепция, называемая сокрытием имени. По сути, имя функции или класса "скрыто", если во вложенной области видимости есть функция / класс с таким же именем. Это не позволяет компилятору "видеть" скрытое имя.
Раздел 3.3.7 стандарта C++ гласит:
Имя может быть скрыто явным объявлением того же имени во вложенной декларативной области или производном классе (10.2)
Итак, чтобы ответить на ваш вопрос: в вашем примере void foo(double a);
скрыт void bar_space::foo(Bar a);
Так что вам нужно использовать ::
Оператор области видимости для вызова внешней функции.
Тем не менее, в вашем примере кода вы можете использовать что-то подобное
namespace bar_space
{
using ::foo;
void baz()
{
Bar bar;
foo(5.0);
foo(bar);
}
}
Да, bar_space скрывает оригинальную функцию, и нет, вы не можете сделать так, чтобы foo(5.0) вызывался из wharin bar_space без явной проверки, если foo(double) определено в глобальном пространстве имен.