Соглашение о пространстве имен C ++ - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в C ++.

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

namespace A {
  namespace B {
     function foo() {
     }
  }
  function bar() {
  }
}

, а другой файл имеет следующее:

namespace A {
  namespace C {
     // Call foo() and bar() here.
  }
}

ЕслиЯ хочу вызвать foo и bar внутри пространства имен C, стоит ли мне включать их абсолютное пространство имен?

A::B::foo();
A::bar();

или мне не нужно включать пространство имен A, поскольку все они находятся внутри A?

B::foo();
bar();

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Просто небольшое дополнение.Как сказал конструктор, квалифицированный поиск всегда генерирует правильно сформированный код, но этот код не всегда дает ожидаемый результат.Рассмотрим этот пример устранения неоднозначности

#include <iostream>

void foo(); 
void foo(float);

namespace Boo {
    using ::foo;
    void foo(int a) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
}

void foo() { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
void foo(int a) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
void foo(float) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }

using namespace Boo;

int main(int argc, char *argv[])
{
    foo();       // no error!
    Boo::foo();  // still same
    //foo(3); // aw, there are three of them. Bad, bad `using namespace`!
    Boo::foo(3); 
    Boo::foo(3.f); 
    return 0;
}

пространство имен Boo, в котором имя foo распространяется на Boo::foo.Мы определили foo() после объявления пространства имен, но объявление прототипа должно было быть известно раньше.

Теперь представьте, что Boo - это std, foo прототипы - это что-то вроде abs или sin из стандартного заголовка, и они объявлены таким образом.Реализации заголовка могут использовать трюк сверху.Результат переопределения имен, используемых в стандартном пространстве имен, описывается как неопределенный, потому что в зависимости от того, была ли using в реализации или нет, программа будет использовать стандартную или пользовательскую функцию без учета квалифицированного имени.

TL; DR: результат квалифицированного поиска всегда верен, но не всегда является точным, если зарезервированные имена не соблюдаются.

0 голосов
/ 21 мая 2018

Это поиск имени вопрос.

Итак, если вы прочитали это, вы узнаете разницу между Безусловным поиском и Qualified Lookup

Очевидно, что неквалифицированный поиск здесь допустим, но если вы хотите выполнить некоторую работу, например, однозначную, вы можете использовать квалифицированный поиск.Таким образом, квалифицированный поиск всегда действителен, когда безусловный поиск действителен (если вы можете использовать квалифицированный поиск).

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