2016-03-21 26 views
0

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.

+1

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

Antwort

4

std::shared_ptr ist nicht in unique_ptr umwandelbar.

In Ihrem Fall sollten Sie nur die folgenden:

std::unique_ptr<BaseClass> WorkerClass::DoSomething() 
     return std::make_unique<DerivedClass>(/*args*/); 
} 
+0

Natürlich möchte ich ein 'unique_ptr', kein' shared_ptr' !!! Offensichtlich !! Vielen Dank !!!! – Mendes