如何解决警告警告 C4251:.... 需要有 dll 接口才能由类“TestClass”的客户端使用

问题描述 投票:0回答:1

我创建下面的简单类并构建它

class __declspec(dllexport) TestClass
{
private:
    std::unique_lock<std::mutex > lock;
public:
    void doIt() {
        // do something
    }
};

但是我遇到了下面的警告

1>C:\gitview rm_multi ramework ppCpp cout.h(48,35): warning C4251: 'TestClass::lock': class 'std::unique_lockstd::mutex' 需要使用 dll 接口由“TestClass”类的客户 1>C:\Program Files\Microsoft Visual Studio�2\Enterprise\VC\Tools\MSVC .29.30133\include\mutex(593): 消息:参见 'std::unique_lockstd::mutex' 的声明

在我搜索了一些文章后,我更新了我的代码如下


template<> class __declspec(dllexport) std::unique_lock<std::mutex>;

class __declspec(dllexport) TestClass
{
private:
    std::unique_lock<std::mutex > lock;
public:
    void doIt() {
        // do something
    }
};

此时,我遇到了以下错误...

1>C:\gitview rm_multi ramework ppCpp cout.h(45,9): error C2908: explicit specialization; 'std::unique_lockstd::mutex' 已经被实例化

如何解决这种情况? 我首先尝试的只是在 DLL 之外公开我的课程。

c++ visual-c++ dllexport
1个回答
0
投票

你可以像这样摆脱你的警告:

using PrivateData = struct {
  std::unique_lock<std::mutex > lock;
};

class __declspec(dllexport) TestClass {
private:
  PrivateData data;
public:
  void doIt() {
    // do something
  }
};

如果你的组件的用户不需要知道私有成员,你可以考虑只暴露一个接口:

class __declspec(dllexport) TestClass {
  virtual void doIt() = 0;
};

class TestClassImplementation: public TestClass {
private:
  std::unique_lock<std::mutex> lock;
public:
  void doIt() {
    // do something
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.