2010-05-05 46 views
1

在基于插件的C++项目中,我有一个用于在主应用程序和插件之间交换数据的TmpClass。因此,相应的TmpClass.h包含在主应用程序项目包含的抽象插件接口类中,并由每个插件实现。C++:不内联时,构造函数/析构函数未解析吗?

由于插件在TmpClass实例的STL向量上工作,因此需要为TmpClass设置默认的构造函数和析构函数。我曾在TmpClass.h宣布这些:

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

TmpClass.cpp实现它们。

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

然而,编译插件时,这会导致链接器抱怨大约两个无法解析的外部 - 本所要求的std::vector<TmpClass>模板实例化默认的构造函数和TmpClass析构函数 - 即使所有其他功能我宣布在TmpClass.h和实施TmpClass.cpp工作。只要我从.cpp文件中删除(空的)默认构造函数和析构函数并将它们内联到.h文件中的类声明中,插件就可以编译和工作。

为什么它默认的构造函数和析构函数内联这个代码来编译?为什么它甚至是maatter? (我正在使用MSVC++ 8)。

+2

您是否将TmpClass.cpp包含到项目中? – SysAdmin 2010-05-05 05:19:45

+0

是 - 请参阅我的评论以回答1. – Anamon 2010-05-05 05:26:16

回答

2

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

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

+1

感谢您的回复,但.cpp文件已添加到项目中并进行编译。正如我所说的,我在头文件中声明了其他函数,并在.cpp文件中实现了这些函数,这些函数可以工作,并且包含一个非默认的构造函数。它只是默认的构造函数和析构函数,当它们未被内联时显示为未解析。 – Anamon 2010-05-05 05:25:51

+0

@Anamon - 您可能已将.cpp文件包含在主应用程序项目中。但那不足以编译你的一个插件项目。你的插件项目永远不知道Ctor和Dtor的定义在哪里。 – SysAdmin 2010-05-05 05:34:35

+0

这完全令人尴尬。搞错了,我确实把错误的文件拖到我的插件项目上,他们找不到.cpp文件。我不应该低估我忽视最明显的事情的能力。谢谢你的帮助! – Anamon 2010-05-05 09:13:50

0

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

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

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

相关问题