Шаблонный конструктор копирования терпит неудачу с определенным шаблонным типом

Поскольку некоторые из моего кода требуют неявного преобразования между матрицами разных типов (например,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));
        }
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос