Hãy nói rằng tôi có hệ thống phân cấp sau các lớp:Cách đúng trở về std :: unique_ptr đến một đối tượng của lớp đa hình
struct Base
{
};
struct Derived : public Base
{
void DoStuffSpecificToDerivedClass()
{
}
};
Và phương pháp nhà máy sau:
std::unique_ptr<Base> factoryMethod()
{
auto derived = std::make_unique<Derived>();
derived->DoStuffSpecificToDerivedClass();
return derived; // does not compile
}
Vấn đề là, câu lệnh return
không biên dịch, bởi vì std::unique_ptr
không có một hàm tạo bản sao với sự hỗ trợ hiệp phương sai (có ý nghĩa vì nó không có bất kỳ trình tạo bản sao nào), nó chỉ có một hàm tạo di chuyển với sự hỗ trợ hiệp phương sai.
Cách tốt nhất để giải quyết vấn đề này là gì? Tôi có thể nghĩ đến hai cách:
return std::move(derived); // this compiles
return std::unique_ptr<Base>(derived.release()); // and this compiles too
EDIT 1: Tôi đang sử dụng Visual C++ 2013 như trình biên dịch của tôi. Thông báo lỗi ban đầu cho return derived
trông như thế này:
Error 1 error C2664: 'std::unique_ptr<Base,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : cannot convert argument 1 from 'std::unique_ptr<Derived,std::default_delete<Derived>>' to 'std::unique_ptr<Derived,std::default_delete<Derived>> &&'
EDIT 2: Nó là một giao diện điều khiển ứng dụng mới được tạo ra từ một tiêu chuẩn VS 2013 mẫu. Tôi chưa tinh chỉnh bất kỳ cài đặt trình biên dịch nào. dòng lệnh biên dịch trông như thế này:
gỡ lỗi:
/Yu"stdafx.h" /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc120.pdb" /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\CppApplication1.pch"
phát hành:
/Yu"stdafx.h" /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc120.pdb" /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\CppApplication1.pch"
Biên dịch tốt với VC++ 2013. Đăng một MCVE và cho chúng tôi biết cách bạn gọi trình biên dịch. –
@ChristianHackl Tôi đã thêm thông tin dòng lệnh trình biên dịch vào câu hỏi của mình. Nhân tiện, C++ Shell không biên dịch: http://cpp.sh/8lxwn –
Vẫn không có MCVE. http://stackoverflow.com/help/mcve –