Проблема в том, что, помещая заголовки в пространство имен, вы заставляете их объявлять функции в этом пространстве имен - но определения (реализации) этих функций не существуют в этом пространстве имен, поэтому, когда вы связываете, онине удается найти, и связывание не удается.
Чтобы привести конкретный пример, допустим, у вас есть заголовок, объявивший функцию int f(int)
.Включая это в фигурные скобки для пространства имен, вы превращаете это в объявление для int somenamespace::f(int)
.
Хотя int ::f(int)
было определено, int somenamespace::f(int)
не имеет, поэтому вы не можете связать.
Обратите внимание, что это не относится к extern "C"
функциям.Они в основном игнорируют пространства имен, поэтому (например) что-то вроде:
namespace x {
#include <stdio.h>
}
не повлияет на обычные функции C в stdio.h
.