Конструктор и экземпляр-конструктор для класса, содержащего объединение с нетривиальными членами

Я пытаюсь реализовать пользовательский тип варианта, который использует объединение для хранения данных различных типов. В полеtype_id Я планирую хранить данные какого типа хранятся в объединении. Союз содержит нетривиальных членов. Вот моя текущая реализация:

struct MyVariant {
  enum { t_invalid, t_string, t_int, t_double, t_ptr, t_dictionary } type_id;
  union {
    int                             as_int;
    double                          as_double;
    std::string                     as_string;
    std::unique_ptr<int>            as_ptr;
    std::map<int, double>           as_dictionary;
  };
};

Я пытаюсь создать экземплярMyVariant как следует:

MyVariant v;

Я получаю сообщение об ошибке:Вызов неявно удаленного конструктора по умолчанию MyVariant, Итак, я попытался реализовать конструктор вручную следующим образом:

MyVariant() : type_id{t_int}, as_int{0} {}

Это дает мне похожее сообщение об ошибке:Попытка использовать удаленную функцию, Далее я попытался реализовать следующий конструктор:

MyVariant(int value) : type_id{t_int}, as_int{value} {}

и построить мой экземпляр следующим образом:

MyVariant v{123};

=> то же сообщение об ошибке:Попытка использовать удаленную функцию.

Я также начал реализовывать конструктор копирования, это выглядит следующим образом. Однако, конечно, это не помогает с ошибками компилятора.

MyVariant::MyVariant(const MyVariant& other)
{
    type_id = other.type_id;
    switch (type_id) {
        case t_invalid:
            break;
        case t_string:
            new (&as_string) std::string();
            as_string = other.as_string;
            break;
        case t_int:
            as_int = other.as_int;
            break;
        case t_double:
            as_double = other.as_double;
            break;
        case t_ptr:
            new (&as_ptr) std::unique_ptr<int>(nullptr);
            as_ptr = std::make_unique<int>(*other.as_ptr);
            break;
        case t_dictionary:
            new (&as_dictionary) std::map<int, double>();
            // TODO: copy values from other
            break;
    }
}

Я использую Xcode и Apple LLVM 6.1 в качестве компилятора.

Основной вопрос: почему я получаю ошибки компилятора, которые я получаю, и как я должен изменить свой код, чтобы он компилировался?

Дополнительный вопрос: я в правильном направлении с моими реализациями для конструктора и конструктора копирования?

Ответы на вопрос(1)

Ваш ответ на вопрос