C++ 如果使用非基元类型,清除泛型数组将引发逻辑错误

C++ 如果使用非基元类型,清除泛型数组将引发逻辑错误,c++,templates,gcc,C++,Templates,Gcc,我有一个泛型数组类,如果与非原语类型一起使用,它会抛出一个logic\u错误 模板类: 引发的异常: 当调用::fill()时(/*1*/),这在数组中发生 我想用T类型的Null元素填充整个数组(如int为0或Nullif指针等)——而不迭代每个元素memset()在这里不是一个好的解决方案,不是吗?这里是您应该做的。这是具有正确类框架的最小代码 template<class T> class Array { T *m_elements; //declare a p

我有一个泛型数组类,如果与非原语类型一起使用,它会抛出一个
logic\u错误

模板类: 引发的异常: 当调用
::fill()
时(
/*1*/
),这在
数组中发生


我想用
T
类型的Null元素填充整个数组(如int为0或
Null
if指针等)——而不迭代每个元素
memset()
在这里不是一个好的解决方案,不是吗?

这里是您应该做的。这是具有正确类框架的最小代码

template<class T> 
class Array
{
     T  *m_elements;  //declare a pointer member 
     size_t m_size;   //count of the elements

public:    

    Array(size_t size) : m_size(size), m_element(new T[size]())
    {                // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     //    use member-initialization-list
    }

    ~Array(); //must define it

    Array(Array const & other); //must define it

    Array& operator=(Array const & other); //must define it

    Array(Array&& temporary); //better define it (in C++11)
    Array& operator=(Array&& temporary); //better define it (in C++11)

    //other
};
模板
类数组
{
T*m_元素;//声明指针成员
size\u t m\u size;//元素的计数
公众:
数组(size\u t size):m\u size(size),m\u元素(新的t[size]())
{                // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//使用成员初始化列表
}
~Array();//必须定义它
数组(Array const&other);//必须定义它
数组和运算符=(数组常量和其他);//必须定义它
数组(Array&&temporary);//更好地定义它(在C++11中)
数组和运算符=(数组和临时);//更好地定义它(在C++11中)
//其他
};
要了解为什么必须定义析构函数、复制构造函数和复制赋值,更好地定义移动构造函数和移动赋值,请参见以下内容(按顺序):


    • 以下是您应该做的事情。这是具有正确类框架的最小代码

      template<class T> 
      class Array
      {
           T  *m_elements;  //declare a pointer member 
           size_t m_size;   //count of the elements
      
      public:    
      
          Array(size_t size) : m_size(size), m_element(new T[size]())
          {                // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                           //    use member-initialization-list
          }
      
          ~Array(); //must define it
      
          Array(Array const & other); //must define it
      
          Array& operator=(Array const & other); //must define it
      
          Array(Array&& temporary); //better define it (in C++11)
          Array& operator=(Array&& temporary); //better define it (in C++11)
      
          //other
      };
      
      模板
      类数组
      {
      T*m_元素;//声明指针成员
      size\u t m\u size;//元素的计数
      公众:
      数组(size\u t size):m\u size(size),m\u元素(新的t[size]())
      {                // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      //使用成员初始化列表
      }
      ~Array();//必须定义它
      数组(Array const&other);//必须定义它
      数组和运算符=(数组常量和其他);//必须定义它
      数组(Array&&temporary);//更好地定义它(在C++11中)
      数组和运算符=(数组和临时);//更好地定义它(在C++11中)
      //其他
      };
      
      要了解为什么必须定义析构函数、复制构造函数和复制赋值,更好地定义移动构造函数和移动赋值,请参见以下内容(按顺序):


      什么是
      T元素[]
      ?这是不标准的。什么是
      this->elements[size]应该怎么做?(看起来你来自Java!)不要用NULL初始化所有内容,用
      t()
      初始化它
      std::string
      在一个构造函数中接受一个
      char*
      ,因此它接受
      NULL
      ,但不会用空字符串初始化它。如果需要空字符串,请默认构造它。@Nawaz:catch!。我想创建一个具有构造函数长度的C++元素。Chris是正确的,您正在使用
      NULL
      初始化值类型
      std::string
      ,这会引发异常。默认使用
      T()
      构造对象。您还没有创建数组
      元素
      ,您必须使用
      新的T[size]
      @ollo创建它,您可以得到类型决定的任何结果。对于像
      int
      这样的东西,根据规范,这是0,但是如果您自己创建,您可以提供一个默认构造函数,并使默认构造的对象成为您想要的任何对象,或者如果没有其他构造函数,则使用为您提供的构造函数。对于
      std::string
      ,这是一个空字符串。对于
      std::vector
      ,一个空向量。什么是
      T元素[]
      ?这是不标准的。什么是
      this->elements[size]应该怎么做?(看起来你来自Java!)不要用NULL初始化所有内容,用
      t()
      初始化它
      std::string
      在一个构造函数中接受一个
      char*
      ,因此它接受
      NULL
      ,但不会用空字符串初始化它。如果需要空字符串,请默认构造它。@Nawaz:catch!。我想创建一个具有构造函数长度的C++元素。Chris是正确的,您正在使用
      NULL
      初始化值类型
      std::string
      ,这会引发异常。默认使用
      T()
      构造对象。您还没有创建数组
      元素
      ,您必须使用
      新的T[size]
      @ollo创建它,您可以得到类型决定的任何结果。对于像
      int
      这样的东西,根据规范,这是0,但是如果您自己创建,您可以提供一个默认构造函数,并使默认构造的对象成为您想要的任何对象,或者如果没有其他构造函数,则使用为您提供的构造函数。对于
      std::string
      ,这是一个空字符串。对于
      std::vector
      ,一个空向量。谢谢<代码>:m_size(size),m_元素(新的T[size]())
      是键:-)。顺便说一句,我已经定义了copyconstructor、操作符等,但在我的示例中没有定义。解决了我的问题,再次感谢@奥利奥:我仍然建议你阅读我提供的这个链接的主题。他们真的很好,理解这个概念很重要。@ollo:我很高兴知道这一点。:-)完成三件事的强制性规则后,切换到RAII:。它是C++中使用资源的现代方式,在使用时没有任何限制,使用起来很好。谢谢!代码>:m_size(size),m_元素(新的T[size]())
      是键:-)。顺便说一句,我已经定义了copyconstructor、操作符等,但在我的示例中没有定义。解决了我的问题,再次感谢@奥利奥:我仍然建议你阅读我提供的这个链接的主题。他们真的很好,理解这个概念很重要。@ollo:我很高兴知道这一点。:-)完成三件事的强制性规则后,切换到RAII:。这是现代社会使用资源的方式
      Array<string> arr(size); // <-- Exception thrown here
      cout << arr.toString() << endl;
      
      terminate called after throwing an instance of 'std::logic_error'
        what():  basic_string::_S_construct null not valid
      
      template<class T> 
      class Array
      {
           T  *m_elements;  //declare a pointer member 
           size_t m_size;   //count of the elements
      
      public:    
      
          Array(size_t size) : m_size(size), m_element(new T[size]())
          {                // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                           //    use member-initialization-list
          }
      
          ~Array(); //must define it
      
          Array(Array const & other); //must define it
      
          Array& operator=(Array const & other); //must define it
      
          Array(Array&& temporary); //better define it (in C++11)
          Array& operator=(Array&& temporary); //better define it (in C++11)
      
          //other
      };