2016-07-21 12 views
0

私は完璧なフォワーディングの古典的な例として、スマートポインタの作成に取り組んでいます。スマートなポインタの作成者

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); 

しかし、それはと言って、コンパイルされません「への呼び出しに該当する関数 『のstd :: shared_ptrの:: shared_ptrの(int型)』」

+6

あなたはusinする必要がありますg 'T &&' for forwardingとelipsis '...'はバリデーショナルテンプレート用です。 – Xarn

+0

この例はどこで手に入りましたか?それについては何も「古典的」ではないようです。 –

+1

作成の「新しいT」部分が欠落しています。今では、 'std :: shared_ptr 'を引数としてintを与えて作成しようとしていますが、明らかに動作しません。 – Xarn

答えて

0

それは(それがすべき)あなたのコンパイラで利用可能な場合は、std::make_shared()を使用する必要があります:あなたはのnew「エドインスタンスへの入力引数を渡していないので、あなたのマニュアル実装は動作しません

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

shared_ptrを保持するためのTあなたはshared_ptrコンストラクタに直接引数を渡そうとしています。これは、shared_ptrの動作とは異なり、コードがコンパイルできない理由です。

あなたは例えば、Tコンストラクタに引数を転送し、shared_ptrコンストラクタにTnew編インスタンスのポインタを渡す必要があります。

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

または:

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

その後のことができます。これを行う:

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

をあなたは正しくあなたの完璧な転送機能を書いた場合

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

それはsurprisすべきではない:それはその引数を、転送されるよう、

shared_ptr<int> p = smartPointerMaker(42); 

に相当しますこれはコンパイルされません。

関連する問題