2016-07-21 22 views
0

Ich arbeite an dem klassischen Beispiel für perfekte Weiterleitung: der Smart Pointer Maker.Ein Smart Pointer Maker

template<typename T> 
    //Return a smart pointer on the given objet 
    shared_ptr<T> smartPointerMaker(T&& arg) 
    { 
     return shared_ptr<T>(forward<T>(arg)); 
    } 

//In the main... 
shared_ptr<int> p = smartPointerMaker(42); 

Aber es lässt sich nicht kompilieren und sagte, dass „keine passende Funktion für Aufruf von‚std :: shared_ptr :: shared_ptr (int)‘“

+6

Sie sollten Usin sein g 'T &&' für Weiterleitung und eine elipsis '...' für variadische Vorlagen. – Xarn

+0

Woher hast du dieses Beispiel? Es scheint nichts "Klassisches" zu geben. –

+1

Nun fehlt der 'neue T'-Teil der Erstellung. Im Moment versuchen Sie ein 'std :: shared_ptr ' zu erstellen, indem Sie ihm einen int als Argument geben, was offensichtlich nicht funktioniert. – Xarn

Antwort

0

Sie sollten mit std::make_shared() werden, wenn es in Ihrem Compiler verfügbar ist (was es sein sollte):

shared_ptr<int> p = make_shared<int>(42); 

Ihre manuelle Implementierung funktioniert nicht, weil Sie nicht das Eingabeargument zu einem new ‚sind vorbei ed Instanz T für die shared_ptr zu halten. Sie versuchen, das Argument an den Konstruktor shared_ptr direkt übergeben, was nicht funktioniert shared_ptr funktioniert, und warum der Code nicht kompilieren.

Sie müssen das Argument der T Konstruktor zu übermitteln und eine new ed Instanz Zeiger von T zum shared_ptr Konstruktor übergeben, zB:

template<class T, class U> 
shared_ptr<T> smartPointerMaker(U&& arg) 
{ 
    return shared_ptr<T>(new T(forward<U>(arg))); 
} 

Oder:

template<class T, class... U> 
shared_ptr<T> smartPointerMaker(U&&... args) 
{ 
    return shared_ptr<T>(new T(forward<U>(args)...)); 
} 

Dann können Sie tun Sie dies:

shared_ptr<int> p = smartPointerMaker<int>(42); 
0

Wenn Sie Ihre perfekte Forwarding-Funktion geschrieben haben richtig , so dass sie ihre Argumente weiterleitet, dann

shared_ptr<int> p = smartPointerMaker(42); 

entspricht:

shared_ptr<int> p = shared_ptr<int>(42); 

es sollte nicht sein surpris dass dies nicht kompiliert wird.

Verwandte Themen