C ++:未内联时构造函数/析构函数未解析?

时间:2010-05-05 05:15:30

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

在基于插件的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)。

2 个答案:

答案 0 :(得分:2)

您描述的行为仅表示您忘记将TmpClass.cpp文件包含在项目中。

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

答案 1 :(得分:0)

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

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

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