由于我的一些代码需要在不同类型的矩阵之间进行隐式转换(例如Matrix<int>
to 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 错误而失败: where U == T
。果然,使用默认Matrix<T>::Matrix(Matrix<T> const&)
签名重载复制构造函数可以解决问题。
这是一个糟糕的解决方案,因为它会导致复制构造器代码的大量复制(字面意思是未更改的复制和粘贴)。更重要的是,我不明白为什么malloc
没有重复代码会出现双释放错误。此外,为什么这里需要非常冗长的template <typename T> template <typename U>
语法而不是标准的语法,而且更简洁,template <typename T, typename U>
?
模板化方法的完整源代码,在 Mac OS 10.5 上使用 G++ v4.0.1 编译。
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));
}
}
}