[编辑:进一步挖掘揭示了一个不同的根本问题。我正在重新表述这个问题,但为了与@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”
根据MS 的回复,这仍然具有某种意义:
如果 TemplatedClass 有构造函数,那么将自动为 ExportedClass 生成构造函数。由于 ExportedClass 已导出,编译器尝试导出构造函数,但无法为其生成代码,因为 ForwardDeclared 是未知的。
但我怀疑这不是最终答案,因为当我为 ExportedClass 声明(甚至没有实现!)一个 ctor 时:
...
class __declspec(dllexport) ExportedClass
{
ExportedClass();
TemplatedClass<ForwardDeclared> TemplateForward;
};
...
编译和链接都成功(带有适当的警告*)。MS-connect 上的问题似乎已被放弃 - 也许任何人都可以对这种奇怪的行为有所了解?
谢谢!
*编辑:生成的警告是C4251:类 'TemplatedClass' 需要有 dll 接口才能被类 'ExportedClass' 的客户端使用