Предположим, что следующий код:
#include <iostream>
using namespace std;
namespace X
{
class A{};
void f(A a){}
void g(int a){}
}
int main()
{
X::A a;
f(a);
g(5);
}
При компиляции кода возникает следующая ошибка компиляции:
main.cpp: В функции 'int main()':
main.cpp: error: 'g' не был объявлен в этой области
Таким образом, функция f
компилируется отлично, но g
- нет. Как? Оба они принадлежат к одному пространству имен. Выводит ли компилятор, что функция f
принадлежит пространству имен X
из аргумента типа X::A
? Как работает компилятор в таких случаях?