Всем доброго времени суток!
Всегда писал так и не задумывался о компоновке
имени класса:
C.h
----------
#pragma once
class w
{
public:
w();
};
C.cpp
----------
#include "C.h"
w::w() {}
A.cpp
-----------
#include "C.h"
B.cpp
-----------
#include "C.h"
Согласно ответам
здесь имя класса, объявленного в пространстве имен имеет внешнюю компоновку.
Так же это подтверждается цитатой из стандарта:
An unnamed namespace or a namespace declared directly or indirectly within an unnamed namespace has internal linkage. All other namespaces have external linkage.
Но у меня сразу возникает мысль. Если компоновка имени внешняя, то это значит, что это имя доступно в других единицах трансляции. Однако, как с функциями не работает:
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
{
}
Собственно вопрос возник, когда я начал получать падения тестов после добавления нового
mock-класса с уже существующим именем, но в совершенно другой cpp-файл.
Вопрос: какой смысл тогда во внешней компоновке имени класса? Прошу экспертов С++ помочь разобраться.