【问题标题】:warning: base class should be explictily initialized in the copy constructor警告:应在复制构造函数中显式初始化基类
【发布时间】:2014-01-15 14:14:21
【问题描述】:

我正在编写一个用于 CUDA 处理的矩阵类。

我编写了一个向量类(以下称为Elements)并将其用于矩阵基数。

这是模板定义:

template <typename T, std::size_t M, std::size_t N>
class Matrix : public Elements< Elements< T, N >, M > {

}

需要注意的是,Elements 类和Matrix 类中都没有动态分配任何内容。

我在复制构造函数中收到warning: base class ‘struct Elements&lt;Elements&lt;double, 2ul&gt;, 2ul&gt;’ should be explicitly initialized in the copy constructor 警告。这是复制构造函数:

    DEVICE HOST
    Matrix(const Matrix & that) {
        for (std::size_t ind = 0; ind < M; ind++) {
            for (std::size_t jnd = 0; jnd < N; jnd++) {
                (*this)[ind][jnd] = that[ind][jnd];
            }
        }
    }

我做错了什么?

【问题讨论】:

标签: c++ copy-constructor


【解决方案1】:

您没有在复制构造函数中初始化基类。试试这个:

Matrix(const Matrix & that) : Elements<Elements<T, N>, M>(that) {
    /* ... */
}

派生类的复制构造函数的初始化列表应该包含对基类复制构造函数的显式调用,就像所有其他构造函数一样,否则,基类将被默认初始化。

编辑:有一个私人的会很方便

typedef Elements<Elements<T, N>, M> basetype;

在你的类定义中。

【讨论】:

  • @dyp:感谢您发现这一点 - 相应地更新了答案。
  • 在调用 Element 的构造函数时使用模板参数会更灵活,或者只有在使用带有 double 类型模板的 Matrix 时才能编译。
  • 这正是我想要的。我正在编辑您的答案以明确地使用 typename T 而不是 double。否则,好节目。
【解决方案2】:

如果您显式定义派生类的复制构造函数并且不在 ctor 列表中调用基类的复制构造函数,则编译器本身将调用基类的默认构造函数。它可能不是你想要的。所以编译器会警告你。

我有一个例子来说明我的文章的不同之处
"Implicitly defined copy constructor and explicitly defined copy constructor: what is the difference" 它是用俄语写的,但您可以使用例如谷歌服务翻译来阅读它。

【讨论】:

    【解决方案3】:

    对于任何派生类,只要派生类存在,就需要构造基类。如果您的基类没有默认(0 参数)构造函数,则必须指定如何在派生类的所有构造函数中构造它。

    所以,假设 Elements 有一个公共复制构造函数,你需要类似的东西:

    Matrix(const Matrix & that) 
    : Elements<Elements<T, N>, M>(that)
    { 
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2014-07-02
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多