Я пытаюсь объявить два класса С1 и С2 в файлах nstest1.h и nstest2.h которые определены в файлах nstest1.cpp и nstest2.cpp соответственно. Оба класса определены в одном пространстве имен.Используя одно пространство имен в C++ для двух классов объявленных и определенных в отдельных файлах
Ниже перечислены файлы:
//nstest1.h
namespace Mine{
class C1{
public:
void callme();
};
}
//nstest2.h
namespace Mine {
class C2 {
public:
void callme();
};
}
//nstest1.cpp
#include<iostream>
#include "nstest1.h"
using namespace std;
using namespace Mine;
void Mine::C1::callme(){
std::cout << "Please call me " << std::endl;
}
//nstest2.cpp
#include<iostream>
#include "nstest2.h"
using namespace std;
using namespace Mine;
void Mine::C2::callme(){
std::cout << "Please call me too" << std::endl ;
}
После файла пытается использовать эти классы, используя пространство имен Mine.
//nstest.cpp
#include<iostream>
#include "nstest1.h"
#include "nstest2.h"
using namespace std;
using namespace Mine;
int main(){
Mine::C1 c1;
Mine::C2 c2;
c1.callme();
c2.callme();
return 0;
}
Когда я компилирую с помощью команды "г ++ nstest.cpp", я получаю следующее сообщение об ошибке:
/tmp/cc2y4zc6.o: In function `main':
nstest.cpp:(.text+0x10): undefined reference to `Mine::C1::callme()'
nstest.cpp:(.text+0x1c): undefined reference to `Mine::C2::callme()'
collect2: error: ld returned 1 exit status
Если определения перемещаются в декларации файлов (nstest1.h и nstest2.h), он отлично работает. Не уверен, что происходит здесь. Я что-то упускаю ? Спасибо заранее.
Скомпилируйте с помощью 'g ++ nstest1.cpp nstest2.cpp nstest.cpp'. Вам нужно скомпилировать все исходные файлы. –
Спасибо :). Он отлично подходит для этого случая. Но возможно ли избежать компиляции деклараций и определений каждый раз? – Chandrahas
Единственный способ включить определение внутри файла заголовка. Компилятор должен увидеть реализацию. Вы также можете использовать make-файл для автоматической компиляции исходных файлов, [пример] (http://stackoverflow.com/questions/231229/how-to-generate-a-makefile-with-source-in-sub-directories-using- just-one-makefil/2484343 # 2484343), тогда все, что вам нужно сделать, это вызвать 'make', чтобы скомпилировать все. –