[编辑:进一步挖掘揭示了一个不同的根本问题。我正在改写这个问题,但保留下面的旧版本,以便与@Leo的答案保持一致
似乎VC ++(VS2005和VS2010下)允许我使用缺少实现的dllexport类!以下代码构建正常:
// missingimp.h :
class __declspec(dllexport) MissingImp
{
void DoStuff(); // no implementation anywhere
void DoMoreStuff(); // neither for this
}
// missingimp.cpp
#include "missingimp.h"
代码编译和链接都很好(在dll配置中) - 当然静态链接与生成的DLL失败。 这是一个错误吗?这种行为是以某种方式设计的吗?
[旧问题:]
我正在尝试dllexport一个类,它有一个在前向声明类型上模板化的数据成员:
// Class2Export.h:
class ForwardDeclared ;
template<class T> class TemplatedClass
{
T *m_ptr;
public:
TemplatedClass() { m_ptr->DoSomething(); }
};
class __declspec(dllexport) ExportedClass
{
TemplatedClass<ForwardDeclared> TemplateForward;
};
// Class2Export.cpp:
#include "Class2Export.h"
(这不是一个人为的例子 - 在实际代码中,TemplatedClass是一个智能指针,但这似乎与手头的问题无关。)
此代码无法使用 -
进行编译,这仍然有些道理错误C2027:使用未定义的类型 'ForwardDeclared'
如果TemplatedClass有一个构造函数 然后是一个构造函数 自动生成 ExportedClass。因为ExportedClass是 导出编译器尝试导出 构造函数但无法生成 代码,因为ForwardDeclared是 未知的。
但我怀疑这不是最终的答案,就像我宣布(甚至没有实施!)一个针对ExportedClass的ctor:
...
class __declspec(dllexport) ExportedClass
{
ExportedClass();
TemplatedClass<ForwardDeclared> TemplateForward;
};
...
编译并链接成功(带有适当的警告*)。在MS-connect上的问题似乎被抛弃了 - 或许任何人都可以对这种奇怪的行为有所了解?
谢谢!
*编辑:生成的警告为C4251: class'TemplatedClass'需要让dll-interface被'ExportedClass'类的客户使用