【发布时间】:2022-01-18 20:08:00
【问题描述】:
#include <iostream>
template <typename T>
class Matrix
{
public:
Matrix() = default;
template <typename U>
Matrix(const Matrix<U>& matrix) {
std::cout << "Copying internal data..." << std::endl;
}
// Matrix(const Matrix<T>& matrix) {
// std::cout << "Copying internal data..." << std::endl;
// }
Matrix(Matrix<T>&& matrix) {
std::cout << "Moving internal data..." << std::endl;
}
};
int main() {
Matrix<int> m1{};
Matrix<double> m2 = m1;
Matrix<int> m3 = m1;
}
在这里,我有一个矩阵类,它可以是int、double 或任何数值的矩阵。
我想定义一个复制构造函数,它接受具有任何数值类型的矩阵并复制其元素。
例如,假设 m1 是 Matrix<double> = {1.1, 2.2, 3.3, ...},Matrix<int> m2 = m1 应将 m2 设置为 {1, 2, 3, ...}。
另外,我想要一个移动构造函数,但是除了它自己的类型(在这个例子中,它是T)之外的任何类型都有一个移动构造函数没有任何意义。
这是因为我要窃取指向数字数组的指针,并且要这样做,它必须是相同的类型。
定义仅接受Matrix<T> 的移动构造函数会自动删除Matrix<T> 的复制构造函数。
我意识到由于我尝试制作的复制构造函数中的参数不一定是相同类型的,所以它不被认为是复制构造函数,除非我专门为Matrix<T>编写复制构造函数(注释复制构造函数),代码将无法编译。
但是即使我没有复制构造函数,我也有一个可以接受任何类型矩阵的构造函数。为什么要专门找拷贝构造函数?
如何只定义一次复制构造函数,并让它处理任何类型的矩阵?
【问题讨论】:
-
"我如何只定义一次复制构造函数,并让它处理任何类型的矩阵?" 恐怕不是,来自cppreference:一个副本
T类的构造函数是一个非模板构造函数,其第一个参数是T&、const T&、volatile T&或const volatile T&,或者没有其他参数,或者其余参数都有默认值。 -
Matrix<double> m2 = m1;-- 这不是复制构造函数,因为类型不同。您必须编写一个“普通”构造函数,它接受一个 A 并从中创建一个 B。 -
converting example(仅适用于 ctor - 如果需要,也可以添加转换赋值运算符)。
-
我同意它不再是复制构造函数,但它是一个有效的构造函数,可以接受任何类型的矩阵。如果我没有复制构造函数,为什么会出现编译错误?为什么不调用这个模板构造函数,它接受任意类型的矩阵?
-
fwiw,您不需要在您的问题中添加“更新”(或“编辑”)。如果有人想查看编辑历史,他们可以在这里:stackoverflow.com/posts/70367073/revisions。 minimal reproducible example 是问题的重要部分,将其放在一些“不是真正的代码”之后,并且大量文字使问题难以阅读
标签: c++ oop templates constructor