我创建下面的简单类并构建它
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 之外公开我的课程。
你可以像这样摆脱你的警告:
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
}
};