Область действия класса - это пространство имен, в котором объявлен класс.Если он объявлен в глобальном пространстве имен, то класс является глобальным.
Класс должен быть определен в каждой единице перевода, которая использует ODR-класс.Все TU, которые ссылаются на имя класса, всегда ссылаются на один и тот же класс, а не на определенный класс TU.Определение класса должно быть одинаковым во всех TU.
Как объявить класс только в области действия единицы перевода
Вы можете использовать безымянное пространство имен:
namespace {
struct this_TU_only {
int member;
};
}
Определение следующего класса в другом TU не будет проблемой:
namespace {
struct this_TU_only {
float member;
};
}
Это связано с тем, что безымянное пространство имен отличается в каждой единице перевода.