Ich baue eine Fabrik Klasse, wo ich eine unique_ptr
zu einem BaseClass
zurückgeben muss. Der zurückgegebene Zeiger eines DerivedClass
Objekt vorgenommen, die zu einem gemeinsamen Zeiger umgewandelt wird und dann unter Verwendung von make_shared
umgewandelt in die gewünschten BaseClass
Zeiger als:dynamic_pointer_cast unerwartetes Verhalten
#include "BaseClass.h"
#include "DerivedClass.h"
std::unique_ptr<BaseClass> WorkerClass::DoSomething()
{
DerivedClass derived;
// Convert object to shared pointer
auto pre = std::make_shared<DerivedClass>(derived);
// Convert ptr type to returned type
auto ret = std::dynamic_pointer_cast<BaseClass>(ptr);
// Return the pointer
return std::move(ret);
}
ist ich diese Compiler-Fehler immer auf std::move
error C2664: 'std::unique_ptr<_Ty>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::nullptr_t'
1> with
1> [
1> _Ty=rfidaccess::BaseClass
1> ]
1> nullptr can only be converted to pointer or handle types
1>c:\project\dev\traansite1r\traansite1rcommon\tag.cpp(261): error C2664: 'std::unique_ptr<_Ty>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::nullptr_t'
1> with
1> [
1> _Ty=rfidaccess::BaseClass
1> ]
1> nullptr can only be converted to pointer or handle types
1>c:\project\dev\traansite1r\traansite1rcommon\tag.cpp(337): error C2664: 'std::unique_ptr<_Ty>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'rfidaccess::AARLocomotiveBaseClass' to 'std::nullptr_t'
1> with
1> [
1> _Ty=rfidaccess::BaseClass
1> ]
1> nullptr can only be converted to pointer or handle types
1>c:\project\dev\traansite1r\traansite1rcommon\tag.cpp(393): error C2664: 'std::unique_ptr<_Ty>::unique_ptr(std::nullptr_t) throw()' : cannot convert parameter 1 from 'rfidaccess::AAREndOfTrainBaseClass' to 'std::nullptr_t'
1> with
1> [
1> _Ty=rfidaccess::BaseClass
1> ]
1> nullptr can only be converted to pointer or handle types
Ich verwende VS2012 ...
Warum verwendet es etwas anderes als deklariert (std::unique_ptr<BaseClass>
)?
Gibt dynamic_pointer_cast
keine std::unique_ptr<BaseClass>
zurück?
Hilfe apprecited, um herauszufinden, was los ist.
Sie beachten Sie, dass 'return std :: move() zu tun;' für eine automatische Speicherdauer Objekt lokal für die Funktion vollkommen überflüssig ist. Es ist implizit und rief [(Named) Returned Value Optimization] (https://en.wikipedia.org/wiki/Return_value_optimization) – JBL