Шаблонный конструктор копирования терпит неудачу с определенным шаблонным типом
Поскольку некоторые из моего кода требуют неявного преобразования между матрицами разных типов (например,Matrix<int>
вMatrix<double>
), Я определил конструктор шаблонной копииMatrix<T>::Matrix(Matrix<U> const&)
вместо стандартногоMatrix<T>::Matrix(Matrix<T> const&)
:
template <typename T> class Matrix {
public:
// ...
template <typename U> Matrix(Matrix<U> const&);
// ...
private
unsigned int m_rows, m_cols;
T *m_data;
// ...
};
С соответствующим типом, добавленным в конструктор копирования, этот метод безупречно конвертируется между матрицами разных типов. Удивительно, но это приводит к ошибке malloc в той самой ситуации, когда функционирует простой конструктор копирования: гдеU == T
, Конечно же, перегружая конструктор копирования по умолчаниюMatrix<T>::Matrix(Matrix<T> const&)
подпись решает проблему.
Это плохое решение, так как оно приводит к массовому дублированию кода конструктора копирования (буквально неизменного копирования и вставки). Что еще более важно, я не понимаю, почему существует двойной бесплатныйmalloc
ошибка без дубликата кода. Кроме того, почему это очень многословноtemplate <typename T> template <typename U>
синтаксис требуется здесь, в отличие от стандарта, и гораздо более кратким,template <typename T, typename U>
?
Полный источник шаблонного метода, скомпилированного с использованием G ++ v4.0.1 на Mac OS 10.5.
template <typename T> template <typename U> Matrix<T>::Matrix(Matrix<U> const& obj) {
m_rows = obj.GetNumRows();
m_cols = obj.GetNumCols();
m_data = new T[m_rows * m_cols];
for (unsigned int r = 0; r < m_rows; ++r) {
for (unsigned int c = 0; c < m_cols; ++c) {
m_data[m_rows * r + c] = static_cast<T>(obj(r, c));
}
}
}