Но у меня сразу возникает мысль. Если компоновка имени внешняя, то это значит, что это имя доступно в других единицах трансляции. Однако, как с функциями не работает:
foo.cpp
----------
void foo() {}
bar.cpp
----------
void foo();
void bar()
{
foo();
}
Почему же? Работает.
То есть я не могу написать так:
A.cpp
----------
class A
{
};
B.cpp
----------
class A;
void foo(A a) // A is an incomplete type
{
}
Но этот пример не имеет никакого отношения к компоновке имени A. Вы не можете написать так, потому что операция передачи по значению недоступна для неполного типа. Но уже вот так вполне можно написать:
A.cpp
----------
class A
{
};
B.cpp
----------
class A;
void foo(A& a) // A is an incomplete type, but who cares
{
}
Вопрос: какой смысл тогда во внешней компоновке имени класса?
Смысл тот, что имя класса (полное, со всеми неймспейсами) обозначает единственную сущность во всех единицах трансляции одной программы.