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

C++ 在C+中使用相同的名称空间+;对于在单独文件中声明和定义的两个类,c++,namespaces,C++,Namespaces,我试图在文件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:

我试图在文件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 ;
}
如果将定义移动到声明文件(nstest1.h和nstest2.h),则可以正常工作。不知道这里发生了什么。我错过什么了吗?
提前感谢:)。

在构建程序时,您需要包括其他.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

构建程序时,需要包含其他.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

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

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

使用
g++nstest1.cpp nstest2.cpp nstest.cpp编译。您需要编译所有源文件。谢谢:)。在这种情况下效果很好。但是有可能避免每次编译声明和定义吗?唯一的方法是将定义包含在头文件中。编译器需要查看实现。您还可以使用makefile自动编译源文件,然后只需调用
make
即可编译所有内容。您可以根据定义创建一个库并链接到它,而不是每次编译它。甚至只需链接到
.o
文件。谢谢James:)在这里编写makefile似乎会有所帮助。使用
g++nstest1.cpp nstest2.cpp nstest.cpp
编译。您需要编译所有源文件。谢谢:)。在这种情况下效果很好。但是有可能避免每次编译声明和定义吗?唯一的方法是将定义包含在头文件中。编译器需要查看实现。您还可以使用makefile自动编译源文件,然后只需调用
make
即可编译所有内容。您可以根据定义创建一个库并链接到它,而不是每次编译它。或者只是链接到
.o
文件。谢谢,詹姆斯:)在这里编写一个makefile似乎会很有帮助。