2017-01-06 5 views
0

私はemplace_backという独自の実装を追加したい独自のテンプレートクラスを実装していません。私はまだテンプレートデザインを学んでいるので、ここであなたのご意見をお待ちしております。emplace_backをテンプレートクラスに追加

template <typename T, typename ...Args> 
class MydataStruct 
{ 
public: 
    //... 
    void emplace_back(Args&&... args) 
    { 
     //... 
     myqueue.emplace_back(args...); 
    } 
    //... 
private: 
    std::deque<T> myqueue; 
}; 

サンプル使用:私は定義されていないemplace_back私はエラーを受け取り、このコードをコンパイルしようとしているときはいつでも

MydataStruct<int> test; 
test.emplace_back(1); 

。それは引数なしでのみ動作します。私はこれをどのように修正すべきですか?

答えて

3

エラーは、バリデーションテンプレートをメソッドに追加するのではなく、クラスのテンプレートパラメータに配置するというエラーです。代わりにこれを試してください。

#include <deque> 

template <typename T /*typename ...Args*/> 
//  remove this ^^^^^^^^^^^^^^^^^ 
class MydataStruct 
{ 
public: 
    //... 
    template<typename ...Args> 
    // add this ^^^^^^^^^^^^^ 
    void emplace_back(Args&&... args) 
    { 
     myqueue.emplace_back(args...); 
    } 
private: 
    std::deque<T> myqueue; 
}; 

int bop() 
{ 
    MydataStruct<int> test; 
    test.emplace_back(1); 
} 

編集:この値は、右値ではできません。 std::forwardを使用する必要があります。

+0

私は参照してください...非常に説明をいただきありがとうございます。 – sebap123

+0

答えが間違っている理由を記したメモを追加するだけではありません。ちょうど正しい答えを書いてください?また、 "R値"ではなく "rvalue" – Barry

7

member functionmember function templateにする必要があります。引数をキャプチャするために可変引数Forwarding Referencesに使用し、その後、myqueue.emplace_back

template <typename T> 
class MydataStruct 
{ 
public: 
    //... 
    template<typename ...Args> 
    void emplace_back(Args&&... args) 
    { 
     //... 
     myqueue.emplace_back(std::forward<Args>(args)...); 
    } 
    //... 
private: 
    std::deque<T> myqueue; 
}; 
0

からstd::forward引数はあなたが

MydataStruct<int,int> test; 
test.emplace_back(1); 

を行う必要があります動作するようにあなたの例を取得するのではなく、emplace_back機能に... argsは移動行く方法です...

関連する問題