如何使用包装类中定义的__declspec(dllexport)结构导出?

时间:2015-11-26 11:48:10

标签: c++ dllexport

是否可以导出包装类的结构而不包装它(struct只包含枚举和原语)?假设我的包装器看起来像这样:

WorkerWrapper.h

#ifdef TESTEXPORTDLL_EXPORTS
#define TESTEXPORTDLL_API __declspec(dllexport)
#else
#define TESTEXPORTDLL_API __declspec(dllimport)
#endif

class Worker;
struct JobTypeInfo;

template class TESTEXPORTDLL_API std::unique_ptr<Worker>;

class TESTEXPORTDLL_API WorkerWrapper {
private:
    std::unique_ptr<Worker> fWorker;

public:
  WorkerWrapper();
  ~WorkerWrapper();
  WorkerWrapper(WorkerWrapper&& aThat);
  WorkerWrapper& operator= (WorkerWrapper&& aThat);

  void DoJob(JobTypeInfo aTypeInfo);
};

使用WorkerWrapper.cpp unique_ptr定期实施处理std::move,这不是我提问的原因。 Worker类在WorkerWrapper中向前声明,并包含我要导出的结构。

Worker.h

struct JobTypeInfo
{
    typedef enum
    {
        DoThis,
        DoThat,
        DoNothing
    } CalcType;
    CalcType sCalcType;

    //... primitives
};

class Worker
{
public:
    void DoJob(JobTypeInfo aTypeInfo);
};

我可以在这做什么?

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果没有包含的方法,导出struct不会做任何事情 - 导出class表示导出其所有方法及其typeinfo(如果它包含 vtable < / em>的

以这种方式导出WorkerWrapper也存在问题,因为std::unique_ptr<Worker>未导出。如果您没有任何内联方法(包括默认实现),它将起作用,但MSVC将为您提供warning C4251

尝试仅传递接口指针。虚拟析构函数是可以的,因为他们称之为正确的解除分配器。

答案 1 :(得分:0)

我只是通过将struct解压缩到自己的头文件中来解决它。