【问题标题】:C++: Constructor/destructor unresolved when not inline?C ++:非内联时未解析构造函数/析构函数?
【发布时间】:2010-05-05 05:15:30
【问题描述】:

在基于插件的 C++ 项目中,我有一个 TmpClass,用于在主应用程序和插件之间交换数据。因此相应的TmpClass.h包含在主应用项目所包含的抽象插件接口类中,并由每个插件实现。

由于插件在TmpClass 实例的STL 向量上工作,因此TmpClass 需要有一个默认构造函数和析构函数。我已经在TmpClass.h 中声明了这些:

class TmpClass {
  TmpClass();
  ~TmpClass();
}

并在TmpClass.cpp 中实现它们。

TmpClass::~TmpClass() {}
TmpClass::TmpClass() {}

但是,在编译插件时,这会导致链接器抱怨两个未解析的外部变量 - TmpClass 的默认构造函数和析构函数,这是 std::vector<TmpClass> 模板实例化所要求的 - 即使我在 TmpClass.h 中声明的所有其他函数和在TmpClass.cpp 工作中实施。一旦我从 .cpp 文件中删除(空)默认构造函数和析构函数并将它们内联到 .h 文件中的类声明中,插件就会编译并工作。

为什么默认构造函数和析构函数必须内联才能编译此代码?为什么它甚至很重要? (我使用的是 MSVC++8)。

【问题讨论】:

  • 您是否将 TmpClass.cpp 包含到项目中?
  • 是的 - 请参阅我的评论以回答 1。

标签: templates stl constructor visual-c++ linker


【解决方案1】:

您描述的行为只是意味着您忘记将TmpClass.cpp 文件包含到项目中。

编译器不能也不会神奇地知道非内联类方法的定义位置。您有责任编译所有.cpp 文件并将它们链接在一起。在 MSVC 中,通常通过将所有 .cpp 文件添加到项目中来完成。

【讨论】:

  • 感谢回复,但是.cpp文件添加到项目中并编译。正如我所说,我在头文件中声明并在 .cpp 文件中实现了其他函数,这些函数可以工作,并且包括一个非默认构造函数。只是默认构造函数和析构函数在未内联时显示为未解析。
  • @Anamon - 您可能已将 .cpp 文件包含在主应用程序项目中。但这还不足以编译您的插件项目之一。你的插件项目永远不知道你的 Ctor 和 Dtor 的定义在哪里。
  • 这太尴尬了。事实证明,我确实将错误的文件拖到了我的插件项目中,但他们找不到 .cpp。我不应该低估我忽略最明显的事情的能力。感谢您的帮助!
【解决方案2】:

我猜你有一个“主应用程序”项目和一个或多个“插件”项目,看起来你没有在插件项目中包含 TmpClass.cpp。我还猜测“您在 .h 中声明并在 .cpp 中实现的所有其他功能”仅由您的主项目使用,而不是由您的插件使用。

正如其他人所说,您可以在您的插件项目中包含 TmpClass.cpp。另一种选择是创建一个 dll “sdk” 项目并将主项目和插件项目链接到它。

如果您仍然认为这一点和 AndreyT 的回答是错误的,您应该提供一些有关您的项目结构的更多信息。

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2011-04-03
    • 2010-12-16
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2012-04-10
    • 2012-11-14
    相关资源
    最近更新 更多