một ví dụ đơn giản
lớp __declspec(dllexport) A
{
public:
vector<>> v;
};
Lỗi biên dịch VS2013 duy nhất_ptr
hàm tạo bản sao đã bị xóa. Nếu tôi xóa. __declspec(dllexport)
, khỏe. Nếu tôi chỉ sử dụng duy nhất_ptr v
, cũng rất tốt. Đây có phải là lỗi trình biên dịch không? Có cách nào để giải quyết điều này? Cảm ơn.
bạn có thể http://webcompiler.cloudapp.net/ Mã hoàn chỉnh cho bản dùng thử như sau
#include
#include
#include
using namespace std;
lớp __declspec(dllexport) A
{
public:
vector<>> v;
};
int main()
{
cout << "Xin chào thế giới" << endl;
}
tạo ra lỗi trình biên dịch:
Biên soạn với /EHsc /nologo /W4 /c
chính.cpp
main.cpp(9): cảnh báo C4251: 'A::v': class 'std::vector<>>,std::allocator>>>' cần có giao diện dll để khách hàng lớp 'A' sử dụng
with
[
_Ty=int
]
c:\tools_root\cl\inc\xutility(2144): lỗi C2280: 'std::unique_ptr> &std::unique_ptr<_Ty,std::default_delete<_Ty>>:: toán tử =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': cố gắng tham chiếu một hàm đã bị xóa
with
[
_Ty=int
]
c:\tools_root\cl\inc\memory(1430): lưu ý: xem khai báo 'std::unique_ptr>::operator ='
with
[
_Ty=int
]
c:\tools_root\cl\inc\xutility(2165): lưu ý: xem tham chiếu đến việc khởi tạo mẫu hàm '_OutIt std::_Copy_impl<_InIt,_OutIt>(_InIt,_InIt,_OutIt,std::_Nonscalar_ptr_iterator_tag)' đang được biên dịch
with
[
_OutIt=std::unique_ptr<>> *,
_InIt=std::unique_ptr<>> *
]
c:\tools_root\cl\inc\vector(973): lưu ý: xem tài liệu tham khảo về khởi tạo mẫu hàm '_OutIt std::_Copy_impl<>>,std::unique_ptr< _Ty,std::default_delete<_Ty>>*>(_InIt,_InIt,_OutIt)' đang diễn ra biên soạn
with
[
_OutIt=std::unique_ptr<>> *,
_Ty=int,
_InIt=std::unique_ptr<>> *
]
c:\tools_root\cl\inc\vector(956): lưu ý: trong khi biên dịch hàm thành viên mẫu lớp 'std::vector<>>,std::allocator>>> &std::vector>,std::allocator>>>::operator =(const std::vector>,std::allocator>>> &)'
with
[
_Ty=int
]
main.cpp(10): lưu ý: xem tham chiếu đến khởi tạo mẫu hàm 'std::vector<>>,std::allocator>>> &std::vector>,std::allocator>>>::operator =(const std::vector>,std::allocator>>> &)' đang được biên dịch
with
[
_Ty=int
]
main.cpp(9): lưu ý: xem tham chiếu đến khởi tạo mẫu lớp 'std::vector<>>,std::allocator>>>' đang được biên dịch
with
[
_Ty=int
]
có vẻ như đang thêm __declspec(dllexport)
Buộc trình biên dịch xác định hàm tạo sao chép được khai báo ngầm và toán tử gán sao chép (thông thường, điều này chỉ xảy ra khi chúng được sử dụng). Những lần lượt gọi v
Hàm tạo bản sao/toán tử gán. .Nhưngstd::vector
Thao tác sao chép đối với trường hợp không thể sao chép T
Các lỗi định dạng như std::unique_ptr
.do đó có lỗi.
Khi một thành viên tình cờstd::unique_ptr
Khi , sự cố không xảy ra vì nó loại bỏ thao tác sao chép một cách rõ ràng, do đó MỘT
Thao tác sao chép mặc định cũng đã bị loại bỏ.
Vì vậy, nếu bạn loại bỏ thao tác sao chép một cách rõ ràng, vấn đề sẽ được giải quyết:
lớp __declspec(dllexport) A
{
public:
A(const A&) = xóa;
Toán tử A&=(const A&) = xóa;
vector<>> v;
};
Tất nhiên, nếu bạnmuốnSao chép các hàm và tự xác định chúng cũng sẽ hữu ích.
Tôi là một lập trình viên xuất sắc, rất giỏi!