2014-01-15 12 views
5

私は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<Elements<double, 2ul>, 2ul>’ 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]; 
      } 
     } 
    } 

私は間違っていますか?

+0

[警告:基本クラス「」明示的にコピーコンストラクタで初期化する必要があります]が重複する可能性(のhttp:/ /stackoverflow.com/questions/9098979/warning-base-class-a-should-be-explicitly-initialized-in-the-copy-constructor) – starsplusplus

答えて

4

コピーコンストラクタで基本クラスを初期化していません。これを試してみてください:

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

派生クラスの初期化リストそうでない場合は、基底クラスがデフォルト初期化されます、他のすべてのコンストラクタと同じように、コピーコンストラクタコピーコンストラクタは、基本クラスの明示的な呼び出しを含める必要があります。

編集:あなたのクラス定義のどこかでプライベート

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

を持つことが便利です。

+0

@dyp:それを見つけてくれてありがとう - それに応じて答えを更新しました。 – arne

+0

Elementのコンストラクタを呼び出すときにテンプレート引数を使用するほうが柔軟性があります。または、Double型でテンプレート化されたMatrixを使用する場合にのみコンパイルできます。 – Kindread

+0

これはまさに私が探していたものです。私はあなたの答えを 'typename T'を二重ではなく明示的に使うように編集しています。そうでなければ、良いショー。 –

0

派生クラスのコピーコンストラクタを明示的に定義し、ベースクラスのコピーコンストラクタをctorリストで呼び出さない場合、コンパイラは基本クラスのデフォルトコンストラクタを呼び出します。それはあなたが望むものではないということは確かです。コンパイラが警告します。

私は私のartical
"Implicitly defined copy constructor and explicitly defined copy constructor: what is the difference" の違いを示す例があり、それはロシア語で書かれていますが、翻訳例のGoogleのサービスで使用してそれを読むことができるようになります。

0

派生クラスの場合、派生クラスがいつでもベースクラスを構築する必要があります。基本クラスにデフォルトの(0引数)コンストラクタがない場合は、派生クラスのすべてのコンストラクタでコンストラクタを構築する方法を指定する必要があります。

ので、Elementsは公共のコピーコンストラクタを持っていると仮定すると、あなたのようなものが必要になります

Matrix(const Matrix & that) 
: Elements<Elements<T, N>, M>(that) 
{ 
    ... 
} 
関連する問題