如何使用命名空间中单独标头中定义的类

时间:2012-01-06 16:05:25

标签: c++ class namespaces reference undefined

我有一个名称空间,我想在其中定义一个类。这个类相当复杂,所以我宁愿在一个单独的头文件中定义它,但即使是最简单的代码也会给我一个“未定义的引用”错误。

的main.cpp

#include <iostream>
namespace A {
    #include "C.hpp"
}

int main()
{
    A::C foo;
    std::cout << foo.member << std::endl;
    return 0;
}

C.hpp

class C {
    public:
     C();
     int member;
}

C.cpp

C::C()
{
    this->member = 10;
}

当我运行g++ C.cpp main.cpp时,我得到“main.cpp :(。text + 0x10):未定义引用`A :: C :: C()'”错误。我认为构造函数的C :: C()定义在某种程度上是错误的,但我不确定如何解决它。

2 个答案:

答案 0 :(得分:4)

您还必须在命名空间C中定义A的构造函数:

namespace A
{
    C::C()
    {
        this->member = 10;
    }
}

答案 1 :(得分:0)

namespace A {
    #include "C.hpp"
}

这是一件非常奇怪的事情。

这会将标头中声明的所有内容放在名为A的名称空间中;具体来说,它为您提供了A::C的声明,当您包含没有周围命名空间的标题时,它是::C的不同类。

您提供了::C::C()的定义;但是main.cpp需要A::C::C()的定义,因为它是它使用的类。那里没有定义,因此错误。

通过将名称空间移动到头文件(并修复C以使用该名称空间),将namespace A正确放入C.cpp,或者删除namespace A。< / p>