Вызов функции, перегруженной в нескольких пространствах имен из одного пространства имен - PullRequest
7 голосов
/ 14 декабря 2010

У меня есть следующий фрагмент кода:

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 ]

8 голосов
/ 14 декабря 2010

В C ++ существует концепция под названием скрытие имени . По сути, имя функции или класса является «скрытым», если во вложенной области видимости есть функция / класс с таким же именем. Это мешает компилятору «видеть» скрытое имя.

Раздел 3.3.7 стандарта C ++ гласит:

Имя может быть скрыто явным объявление того же имени в вложенный декларативный регион или производный класс (10,2)

Итак, чтобы ответить на ваш вопрос: в вашем примере void foo(double a); это скрыто от void bar_space::foo(Bar a); Так что вам нужно использовать оператор :: scoping для вызова внешней функции.

2 голосов
/ 14 декабря 2010

Однако, в вашем примере кода вы можете использовать что-то подобное

namespace bar_space 
{
    using ::foo;
    void baz()
    {
       Bar bar;
       foo(5.0);
       foo(bar);
    }
}
1 голос
/ 14 декабря 2010

Да, bar_space скрывает исходную функцию, и нет, вы не можете сделать так, чтобы foo (5.0) вызывался из wharin bar_space без явного определения области действия , если foo (double) определено в глобальном пространстве имен.

...