它失败的原因是模板没有禁止复制构造函数的隐式声明。它将作为一个简单的转换构造函数,当重载解析选择对象时,可以使用它来复制对象。
现在,您可能在某处复制了矩阵,这将使用隐式定义的复制构造函数进行平面复制。然后,复制的矩阵和副本都会在其析构函数中删除相同的指针。
此外,为什么它非常冗长template(模板)
需要语法
因为涉及到两个模板:Matrix(一个类模板)和转换构造函数模板。每个模板都有自己的模板子句和自己的参数。
你应该摆脱<T>
顺便说一下,在你的第一行。定义模板时不会出现这种情况。
这是一个糟糕的解决方案,因为它会导致大规模复制构造函数代码
您可以定义一个成员函数模板来完成这项工作,并从转换构造函数和复制构造函数中委托。这样,代码就不会重复。
Richard在评论中说得很好,这让我修改了我的回答。如果从模板生成的候选函数比隐式声明的复制构造函数更匹配,则模板“获胜”,并将被调用。以下是两个常见示例:
结构A{模板<类型名T>A(T&){标准::cout<<“A(T&)”;}A(){}};整型main(){A A;A b(A);//模板获胜://A<A>(A&)--专业化//A(常数&);--隐式复制构造函数//(倾向于较少的资格)常数a1;A b1(a1);//隐式复制构造函数获胜://A(常数&)--专业化//A(A常量&)--隐式复制构造函数//(首选非模板)}
如果复制构造函数的任何成员具有
结构B{B(B&){}B(){}};结构A{模板<typename T>A(T&){标准::cout<<“A(T&)”;}A(){}B B;};整型main(){A A;A b(A);//隐式复制构造函数获胜://A<A>(A&)--专业化//A(A&);--隐式复制构造函数//(首选非模板)常数a1;A b1(a1);//模板获胜://A(常数&)--专业化//(隐式复制构造函数不可行)}