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

时间:2012-06-16 01:09:44

标签: 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::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();`

2 个答案:

答案 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文件。好像链接器无法找到您的源文件。