Эти определения
using namespace std;
using namespace mybook;
void showTitle() {
cout << "The Happy Penguin" << endl;
cout << "By John Smith" << endl;
}
void showTableOfContents() {
cout << "Chapter 1" << endl;
cout << "Chapter 2" << endl;
}
объявляют две функции в глобальном пространстве имен.
Итак, теперь у вас есть четыре функции в глобальном пространстве имен и в пространстве имен mybook
, которые имеют идентичные объявления и из-за включения директивы using
using namespace mybook;
поиск по неквалифицированному имени находит все четыре функции. В результате компилятор сообщает о неоднозначности.
Если вы хотите определить функции, которые были объявлены в пространстве имен mybook , тогда вы должны написать
using namespace std;
using namespace mybook;
void mybook::showTitle() {
cout << "The Happy Penguin" << endl;
cout << "By John Smith" << endl;
}
void mybook::showTableOfContents() {
cout << "Chapter 1" << endl;
cout << "Chapter 2" << endl;
}
, что если вам необходимо использовать квалифицированные имена.
Из стандарта C ++ 17 (10.3.1.2 Определения членов пространства имен)
2 Члены именованного пространства имен также могут быть определены вне это пространство имен с явной квалификацией (6.4.3.2) определяемого имени, при условии, что определяемый объект уже был объявлен в пространстве имен, и определение появляется после точки объявления в пространстве имен, которое охватывает пространство имен объявления.
и (7.3.4 Использование директивы)
3 Директива using не добавляет никаких элементов в декларативную область, в которой она появляется
Обратите внимание на то, что двусмысленность возникла из-за неквалифицированного поиска имени.
Если вы использовали поиск по квалифицированному имени, тогда компилятор f Обнулить функции, объявленные в глобальном пространстве имен (в этом случае программа будет выполнена успешно) или в пространстве имен mybook
(в этом случае компилятор или компоновщик сообщит об ошибке, что функции не определены).
Вот демонстрационная программа.
#include <iostream>
namespace mybook
{
void f1();
void f2();
}
using namespace mybook;
void f1() { std::cout << "::f1();\n"; }
void f2() { std::cout << "::f2();\n"; }
int main()
{
::f1();
::f2();
return 0;
}
Ее вывод
::f1();
::f2();
Если вы напишите
mybook::f1();
mybook::f2();
, то произойдет ошибка, что функции не определено.