我正在尝试从另一个文件中的类声明一个对象。我已将#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(){
}
我也在metadata.cpp文件的标题上做using namespace A::B::C;
。有人可以帮我吗?
在int importMetadata()
中的metadata.cpp
函数中我声明Transfer transfer;
所以在metadata.cpp
我正在做'transfer.copydata();`
答案 0 :(得分:2)
由于您有链接器错误而不是编译器错误,这会告诉您#include语句正在执行您想要的操作,并且编译器会识别Transfer类及其构造函数。当链接器尝试在其告知链接但未找到它的.o或.lib文件之一中找到对Transfer :: Transfer()函数的实现的引用时,会发生此错误。
你可能有一个transfer.cpp与transfer.h一起使用,这个文件缺少Transfer构造函数和析构函数的实现。这可能是因为功能完全丢失或者被意外地用不同的签名定义。
所以transfer.cpp应该类似于:
A::B::C::Transfer::Transfer()
{
}
A::B::C::Transfer::~Transfer()
{
}
另一种可能性是您尝试链接库中传输的实现。在这种情况下,您需要告诉链接器使用.lib文件作为输入。此语法取决于您使用的编译器。
答案 1 :(得分:1)
希望你遗漏了transfer.cpp文件的一部分,但是如果你没有,它应该定义命名空间以匹配你的头文件,如:
namespace A{
namespace B{
namespace C{
Transfer::Transfer(){
}
Transfer::~Transfer(){
}
}
}
}
如果您 完全定义了名称空间,无论是内联还是上面,您都需要确保项目中包含transfer.cpp文件。好像链接器无法找到您的源文件。