【问题标题】:C++ constructor undefined referenceC++ 构造函数未定义引用
【发布时间】:2012-06-16 01:09:43
【问题描述】:

我正在尝试从另一个文件中的类声明一个对象。我已将#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 在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;。有人可以帮我吗? 在metadata.cpp 中的函数int importMetadata() 中我声明Transfer transfer; 所以在metadata.cpp 中我正在执行'transfer.copydata();`

【问题讨论】:

  • 请向我们展示一个重现您的错误的完整示例。
  • 很少有需要这么多嵌套命名空间的情况,实际上也从来没有情况需要using namespace ...
  • Transfer 是否定义了默认构造函数?该错误只是告诉您链接器找不到Transfer() 的实现。
  • 可能是您声明了一个,但没有定义它,或者链接器无法找到定义。
  • 请查看我所做的更改

标签: c++ linker g++


【解决方案1】:

由于您有链接器错误而不是编译器错误,这告诉您#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 用于建议缺少的库。另一种选择是 transfer.cpp 存在,但没有被编译到目标中。
  • @Fraser 是对的,如果您定义了 Transfer(int) 之类的东西,那么 transfer.cpp 的编译会出错,说它没有定义。我认为这是一个有用的建议,因为我们不知道“......这里有更多代码”的内容以及所有错误输出是否仅限于问题中出现的内容。
【解决方案2】:

希望您遗漏了部分 transfer.cpp 文件,但如果您没有定义命名空间以匹配您的头文件,如下所示:

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

如果您已经完全定义了命名空间,无论是内联的还是如上所述的,您都需要确保项目中包含 transfer.cpp 文件。似乎链接器无法找到您的源文件。

【讨论】:

  • 如果他没有正确定义命名空间,我认为这会产生编译器错误而不是链接器错误。
  • @Fraser:我也想过,但是编译器会在不同的命名空间中编译两个同名的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多