gpt4 book ai didi

c++ - DLL 导出导致唯一指针问题

转载 作者:行者123 更新时间:2023-12-03 18:13:51 24 4
gpt4 key购买 nike

我有两个文件:

页眉.h

#pragma once

#ifdef UNIQUEPTRISSUE_EXPORTS
#define UNIQUEPTRISSUE_API __declspec(dllexport)
#else
#define UNIQUEPTRISSUE_API __declspec(dllimport)
#endif

UniquePtrIssue.cpp
#include "stdafx.h"

#include "Header.h"

#include <memory>
#include <vector>

class UNIQUEPTRISSUE_API ClassA {

};

class UNIQUEPTRISSUE_API ClassB {
private:
std::vector<std::unique_ptr<ClassA>> x;
};

编译会引发以下错误:

1>d:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.14.26428\include\xutility(2443): error C2280: 'std::unique_ptr> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function 1> with 1> [ 1> _Ty=ClassA 1> ]



访问 unique_ptr 的复制构造函数时似乎会出现类似问题。但它们似乎并不适用。

删除 UNIQUEPTRISSUE_API/ __declspec(dllexport)从两个类声明似乎使错误消失。

显然 __declspec(dllexport) 发生了一些事情。我不明白的声明。有什么方法可以使用 unique_ptr s 之间的导出类?

最佳答案

当你用 declspec(dllexport) 声明一个类时,编译器必须生成类的所有成员函数,包括默认构造函数、复制赋值等函数,因为它不知道导入模块可能需要哪些函数。这在 Using dllimport and dllexport in C++ classes 中有描述。 .

由于 unique_ptr不能被复制,它的复制构造函数和复制赋值运算符被删除,当 vector 对象试图使用它们时,你会得到 C2280错误。

如果不包含 declspec(dllexport) ,编译器只会生成实际使用的函数,避免了有问题的拷贝。

解决此问题的一种方法是导出单个类成员函数,这可能意味着将其中一些指定为默认值。 virtual函数不需要导出,因为它们是由 vtable 处理的。

另一种解决方法是显式删除复制构造函数和复制赋值运算符。由于这将阻止创建默认构造函数并移动构造函数/赋值函数,因此您可能需要将它们默认为默认值。

class UNIQUEPTRISSUE_API ClassB {
public:
ClassB(const ClassB &) = delete;
ClassB &operator=(const ClassB &) = delete;
// You may need to explicitly default these if they are used
ClassB() = default;
ClassB &operator=(ClassB &&) = default;
ClassB(ClassB &&) = default;
private:
std::vector<std::unique_ptr<ClassA>> x;
};

关于c++ - DLL 导出导致唯一指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51033325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com