При использовании пространств имен вы должны обернуть реализацию методов ваших классов в пространство имен также внутри вашего .cpp файла.Ваш a.cpp должен выглядеть примерно так:
//file: A.cpp
#include <B.h>
#include <vector.h>
namespace namespace1 {
using namespace2; // means 'look in namespace2' to the compiler
void A::functionA (){
B testB1;
B testB2;
testB2 = testB1;
testB1.functionB2();
testB1.functionB();
std::vector<B> testvector;
testvector.push_back(testB1);
}
} // namespace1
, а ваш b.cpp должен выглядеть так:
//file B.cpp
#include "B.h"
namespace namespace2 {
void B::functionB() const{
//code...
}
} // namespace2
Обратите внимание, что создание экземпляров объектов типа B работает, потому что конструкторопределяется внутри объявления класса.То же самое относится к B::function2()
.С другой стороны, A::functionA()
и B::functionB()
находятся в глобальном пространстве имен, а не в namespace1 и namespace2, как они должны.
Предложение using namespace_name;
не определяет область действия внутри ваших файлов cpp.Он просто информирует компилятор о том, что нужно искать в этом пространстве имен символы, которые он найдет в этой единице перевода.
Ошибка, которую вы получаете при попытке заполнения вектора, возможно, связана с тем, что ваш типотсутствует реализация functionB()
, потому что она находится в неправильном (глобальном) пространстве имен.Поэтому тип B является неполным и не может быть использован для создания экземпляра класса шаблона.
РЕДАКТИРОВАТЬ: В продолжение комментариев ниже, после некоторых проб и ошибок, оказалось, что на стороне кода все в порядке,но связывание не выполняется из-за циклических зависимостей между lib A и B, которые не очень хорошо видны в этом фиктивном примере, а также из-за других зависимостей, которым для работы необходим правильный порядок связывания.
Поэтому простое изменение порядка следования библиотек нежизнеспособно.Я советую избегать циклических зависимостей, если это возможно, или использовать специальные параметры ld - начальная группа и - конечная группа для решения проблем такого рода.Узнайте больше на страницах руководства gnu , связанных с ld.В Интернете вы найдете много примеров их использования.
Надеюсь, это поможет решить вашу проблему.