Не удается разрешить перегрузку, когда функция, названная одинаково в пространстве имен, вызывается из метода класса - PullRequest
5 голосов
/ 16 мая 2019

В приведенном ниже коде выглядит вполне очевидным, что определение функции для myFn с двумя аргументами должно происходить из пространства имен N. Но компилятор не может его скомпилировать. Это ограничение компилятора (g ++ 8.3) или стандарт C ++?

    #include <bits/stdc++.h>

    using namespace std;

    namespace N
    {
      // Same name function exists in class A
      void myFn(int a, int b)
      {
        cout << a << ' ' << b << endl;
      }
    }

    using namespace N;
    class A {
      public:
        void myFn(int a)
        {
    #ifdef FINE
          // Explicitly specify where should myFn definition come from
          N::myFn(a, a);
    #else
          myFn(a, a);
    #endif
        }
    };

    int main()
    {
      A a;
      a.myFn(3);
      return 2;
    }

1 Ответ

6 голосов
/ 16 мая 2019

Это предназначено.Поиск имени останавливается в области, где имя найдено.Механизм гарантирует, что ваш код ведет себя одинаково, даже если функции добавляются или удаляются из окружающих областей.

В противном случае изменение членов N может привести к нарушению вложенных классов и пространств имен.Рассмотрим возможные катастрофы, если добавить свободную функцию, которая лучше соответствует разрешению перегрузки по сравнению с другим членом класса.Если его не игнорировать, поведение класса может случайно измениться !

Этот пример должен проиллюстрировать проблему:

namespace ns {
  // void foo(int) { std::terminate(); }
  struct C {
      void foo(char) {}
      C() {
          foo(0);
      }
  };
}

В соответствии с текущими правилами,uncommenting foo не будет иметь побочных эффектов.Но если поиск по имени действительно учитывает это, поскольку 0 является int и должно быть преобразовано в char, создание C приведет к прерыванию программы!Это резко и легко обнаружить.Но в реальной программе 100M LOC неправильный поиск имени может привести к ошибкам, которые будут гораздо более зловещими и более сложными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...