我有一个名称空间,我想在其中定义一个类。这个类相当复杂,所以我宁愿在一个单独的头文件中定义它,但即使是最简单的代码也会给我一个“未定义的引用”错误。
的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()定义在某种程度上是错误的,但我不确定如何解决它。
答案 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>