Конструктор копирования шаблона C ++ - PullRequest
0 голосов
/ 06 марта 2020

В конструкторе копирования шаблонов C ++ для класса шаблонов я считаю, что конструктор копирования шаблонов сделать невозможно. Я пытаюсь сделать это и удается добиться успеха. Я думаю, что это потому, что конструктор перемещения включен в класс. Когда я комментирую конструктор перемещения, он не компилируется: error: use of deleted function 'matrix::Matrix<TYPE>::Matrix(const matrix::Matrix<TYPE>&) [with TYPE = double]. Я использую MinGW (G CC 6.3.0) на Windows 10. заголовок:

namespace matrix {
enum IDENTITY { BLANK, I_1, I_2, I_3, I_4};
template<class TYPE = double>
class Matrix {
public:
    Matrix(const Matrix& m) = delete;   //delete normal copy constructor
    template <class U> Matrix(const Matrix<U>& m);   //template copy constructor
    ~Matrix();

    Matrix(Matrix&& m) noexcept{   //move constructor
        std::cout << "Move constructor" << std::endl;
    }
    .
    .//Some other functions declaration
    .
private:
    unsigned int rows_ = 0;
    unsigned int cols_ = 0;
    TYPE *data_;
};
.
.//Member functions definition
.

main:

int main(){
    matrix::Matrix<int> m2(matrix::I_4); //normal constructor, Identity matrix 4x4
    matrix::Matrix<double> m1 = m2;   //copy constructor, error here if without move constructor
    m1(0,1) = 2;   //assign m1(0,1) = 2
    //show matrix
    std::cout << m1;
    std::cout << m2;
}

result:

 1     2     0     0
 0     1     0     0
 0     0     1     0
 0     0     0     1

 1     0     0     0
 0     1     0     0
 0     0     1     0
 0     0     0     1

Process returned 0 (0x0)   execution time : 0.062 s

Вопрос:

  1. Зачем перемещать конструктор make Возможен ли конструктор копирования шаблона?
  2. Есть ли какие-либо последствия этого? Безопасно ли это делать?
  3. Есть ли другой способ написать конструктор копирования шаблона?

1 Ответ

0 голосов
/ 06 марта 2020

Я думаю, вы определили "конструктор". И это не «конструктор копирования». И результатом этого являются следующие ошибки: - если вы объявляете только конструктор перемещения (без конструктора копирования), конструктор копирования «удаляется». - если вы определяете «любой конструктор», то компилятор создает конструктор копирования по умолчанию.

...