C++ C++;构造函数未定义引用

C++ C++;构造函数未定义引用,c++,linker,g++,C++,Linker,G++,我试图从另一个文件中的类声明一个对象。我已将#include“transfer.h”添加到我的metadata.cpp文件中,但出现以下错误: metadata.o: In function `importMetadata': metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::Transfer()' metadata.cpp:(.text+0x81): undefined reference to A::

我试图从另一个文件中的类声明一个对象。我已将
#include“transfer.h”
添加到我的
metadata.cpp
文件中,但出现以下错误:

 metadata.o: In function `importMetadata':
 metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::Transfer()'
metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::~Transfer()'
Transfer.h

namespace A{
  namespace B{
    namespace C{
       class Transfer {
            public:
               Transfer();
               ~Transfer();
               int copydata();
            ... more code goes here.
        };
    }
   }
}
文件
transfer.cpp
如下所示:

Transfer::Transfer(){
}
Transfer::~Transfer(){
}
我还使用名称空间A::B::C做了一个
。有人能帮我吗?

metadata.cpp中的
int importMetadata()
函数中,我声明
Transfer
所以在
metadata.cpp
中,我正在做'transfer.copydata()`

由于存在链接器错误而不是编译器错误,这表明您的#include语句正在执行所需的操作,并且编译器可以识别传输类及其构造函数。当链接器尝试在其通知链接的.o或.lib文件之一中查找对Transfer::Transfer()函数实现的引用,但找不到时,会发生此错误

您可能有一个transfer.cpp与transfer.h一起使用,并且该文件缺少transfer构造函数和析构函数的实现。这可能是因为函数完全丢失,或者是意外地使用不同的签名定义的

因此transfer.cpp应该类似于:

A::B::C::Transfer::Transfer()
{
}

A::B::C::Transfer::~Transfer() 
{
}

另一种可能是,您正在尝试链接库中传输的实现。在这种情况下,您需要告诉链接器使用.lib文件作为输入。此操作的语法将取决于您使用的编译器。

希望您省略了transfer.cpp文件的一部分,但如果您没有这样做,它应该定义名称空间以匹配头文件,如下所示:

namespace A{
  namespace B{
    namespace C{
        Transfer::Transfer(){
        }
        Transfer::~Transfer(){
        }
    }
  }
}

如果完全定义了名称空间(内联或如上所述),则需要确保项目中包含transfer.cpp文件。链接器似乎找不到您的源文件。

请给我们一个完整的示例,重现您的错误。很少有情况需要这么多嵌套的命名空间,而且几乎从来没有情况需要使用命名空间的
传输
是否定义了默认构造函数?错误只是告诉您链接器找不到
Transfer()
的实现。可能是您声明了一个,但没有定义它,或者链接器找不到定义。请查看我所做的更改,如果函数是意外使用不同的签名定义的,这将产生一个编译器错误而不是链接器错误,不是吗+不过,我还是要感谢你推荐丢失的库。另一个选项是transfer.cpp存在,但没有被编译到目标中。@Fraser是对的,如果您定义了类似transfer(int)的内容,那么transfer.cpp的编译会出错,说它没有定义。我认为这是一个有用的建议,因为我们不知道“这里有更多的代码”,也不知道所有的错误输出是否局限于问题中给出的内容。如果他没有正确定义名称空间,我认为这将产生编译器错误而不是链接器错误。@Fraser:我也考虑过这一点,但是编译器将在不同的名称空间中编译两个同名的类。