Какой смысл внешней компоновки имени класса в C++?
Но у меня сразу возникает мысль. Если компоновка имени внешняя, то это значит, что это имя доступно в других единицах трансляции. Однако, как с функциями не работает: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
{
}Вопрос: какой смысл тогда во внешней компоновке имени класса?
Смысл тот, что имя класса (полное, со всеми неймспейсами) обозначает единственную сущность во всех единицах трансляции одной программы.
Здравствуйте!Смысл тот, что имя класса (полное, со всеми неймспейсами) обозначает единственную сущность во всех единицах трансляции одной программы.
Да, я тоже думал, что это так. Но пример ниже отлично работает:A.cpp
----------
struct A
{
   void foo() {}
};

void fooA()
{
   A a;
   a.foo();
}

B.cpp
----------
struct A
{
   void foo() {}
};

void fooB()
{
   A a;
   a.foo();
}
И получается что имя класса не такая уж и уникальная сущность в пределах всей программы.
И действительно пример с неполным типом тут не причем, чего это я его запостил... ?Почему же? Работает.
Это Вы имеете ввиду классический пример, когда мы включаем в cpp файлы только объявление класса?