I am trying to program a CVariant class which will be used by a CArray class which has a member std::vector<CVariant> m_Array.
The header part of the CVariant class is as follows:
class CVariant {
    static double TOLERANCE;
    typedef union Element {
        std::string m_String;
        double m_Number;
        Element() {
            memset(this, 0, sizeof(Element));
        }
        Element(std::string str) {
            new(&m_String)std::string(str);
        }
        Element(double num) {
            //m_String.~basic_string();
            new(&m_Number)double(num);
        }
        ~Element() {
            m_String.~basic_string();
        }
    }Element;
public:
    typedef enum TYPE { STRING, NUMBER } TYPE;
    CVariant() {  }
    CVariant(const std::string str);
    CVariant(const double num);
    CVariant(const CVariant& rhs);
    CVariant& operator=(const CVariant& rhs);
The cpp is:
CVariant::CVariant(const std::string str)
{
    m_Element = new Element(str);
    m_Type = STRING;
}
CVariant::CVariant(const double num)
{
    m_Element = new Element(num);
    m_Type = NUMBER;
}
CVariant::CVariant(const CVariant& rhs)
{
    m_Element->m_String = rhs.GetString();
    m_Element->m_Number = rhs.GetNumber();
    m_Type = rhs.GetElementType();
}
CVariant& CVariant::operator=(const CVariant& rhs)
{
    if (this == &rhs) return *this;
    m_Element->m_String = rhs.GetString();
    m_Element->m_Number = rhs.GetNumber();
    m_Type = rhs.GetElementType();
    return *this;
}
The following part of the code crashes :
CVariant variant(number);
m_Array.at(i)=variant;
If I run the code without making it union, it works well; however, with union it crashes. I tried different combinations, such as anonymous unions but still could not get it to work properly.
EDIT 1: Upon the comment, the following changes fixes the problem:
CVariant::CVariant(const CVariant& rhs)
{
    m_Type = rhs.GetElementType();
    if(m_Type==STRING)  m_Element = new Element (rhs.GetString());
    if(m_Type==NUMBER) m_Element = new Element(rhs.GetNumber());
}
CVariant& CVariant::operator=(const CVariant& rhs)
{
    if (this == &rhs) return *this;
    m_Type = rhs.GetElementType();
    if (m_Type == STRING)   m_Element = new Element (rhs.GetString());
    if (m_Type == NUMBER) m_Element = new Element(rhs.GetNumber());
    return *this;
}
