2017-09-01 10 views
2

コピーコンストラクタを持たないテンプレートクラスのインスタンスをマップに挿入しようとしています。 emplace関数では、コンパイラーがコピーコンストラクターを呼び出すため、以下のコードは機能しません。 が不要なコピーや移動操作を回避しながら据え付けるの挿入時に構造体を含むstd :: mapにテンプレートクラスを挿入します

慎重に使用することは、新しい要素を構築することができます:私は移動またはコピーされませんを据え付けるC++ referenceからわかるので、私は、理由を理解していません。

これは私のコードです:

#include <map> 
#include <string> 

template<typename T> class Class_a 
{ 
    public: 
     Class_a(T t1, T t2) : t1_(t1), t2_(t2) {} 
     ~Class_a() {} 
     Class_a(const Class_a&) = delete; 
     Class_a& operator=(const Class_a&) = delete; 
     Class_a(Class_a&&) = delete; 
    private: 
     const T t1_; 
     const T t2_; 
}; 

template<typename T> 
using Class_a_map = std::map<std::string, Class_a<T>>; 

int main() 
{ 
    Class_a_map<double> class_a_map; 
    std::string name = "test"; 
    double number1 = 42; 
    double number2 = 43; 
    class_a_map.emplace(name, Class_a<double>(number1, number2)); 

    return 0; 
} 
+0

なぜクラスを移動不能にしますか?移動可能だがコピーできない場合、これはうまく動作しているはずです。 – CoryKramer

答えて

2

あなたは場所にオブジェクトを作成するためにstd::piecewise_constructstd::forward_as_tupleを使用することができます。

class_a_map.emplace(
    std::piecewise_construct, 
    std::forward_as_tuple(name), 
    std::forward_as_tuple(number1, number2) 
); 

live wandbox example


std::map::emplace完全に前方引数の束のキー/値の格納に使用根底std::pairします。 std::pair::pairには、最初の引数としてstd::piecewise_construct_t、次に2つのstd::tupleインスタンスが必要です。最初のものは.firstを構築するために使用され、2番目は.secondの構築に使用されます。 cppreferenceから

std::pairさんに関する区分のコンストラクタ:

転送しfirst_argsの要素firstのコンストラクタへとsecondのコンストラクタにsecond_argsの要素を転送します。これは、コピー可能でない非可動型のペアを作成するために使用できる唯一の非デフォルトコンストラクタです。

+0

この場合、 'tie'は短くなります。 –

関連する問題