在C ++中为在单独文件中声明和定义的两个类使用相同的命名空间

时间:2015-09-23 19:57:46

标签: c++ namespaces multiple-files

我想在文件 nstest1.h nstest2.h 中声明两个类 C1 C2 它们分别在文件 nstest1.cpp nstest2.cpp 中定义。这两个类都在相同的命名空间下定义。

以下是文件:

//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;
}

当我使用命令“g ++ 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),它可以正常工作。不知道这里发生了什么。我错过了什么吗? 在此先感谢:)。

2 个答案:

答案 0 :(得分:3)

构建程序时需要包含其他.cpp文件。

选项1:编译所有文件并在一个命令中构建可执行文件

g++ nstest.cpp nstest1.cpp nstest2.cpp -o nstest

选项2:单独编译每个文件,然后在

之后构建可执行文件
g++ -c nstext1.cpp
g++ -c nstest2.cpp
g++ -c nstest.cpp
g++ nstest.o nstest1.o nstext2.o -o nstest

答案 1 :(得分:1)

您的问题发生在链接时。你的标题很好。但是你应该编译其他的cpp文件。