派生类操作符=错误
Derived class operator = error
在编译以下代码时出现错误。我想创建一个叫做SqMatrix的派生类,方阵,作为matrix的派生类型。然而,编译器不允许我实例化一些自定义运算符。下面是我的代码为matrix.h
#ifndef matrix_h
#define matrix_h
#include <string>
#include <vector>
#include <typeinfo>
template<class T>
class Matrix {
private:
size_t nrow;
size_t ncol;
std::string typenm;
std::vector<T> *vec;
public:
Matrix(): nrow(0), ncol(0), vec(), typenm("") {}
Matrix(size_t nr, size_t nc, T value=T()): nrow(nr), ncol(nc), typenm(std::string(typeid(T).name()))
{ vec = new std::vector<T>(nrow*ncol, value); }
~Matrix()
{ delete vec; }
size_t getnrow() const
{ return nrow; }
size_t getncol() const
{ return ncol; }
std::string gettypenm() const
{ return typenm; }
T *getdata()
{ return vec->data(); }
T *getdata() const
{ return vec->data(); }
T &at(size_t ir, size_t ic)
{ return vec->at(ic*nrow+ir); }
T &at(size_t ir, size_t ic) const
{ return vec->at(ic*nrow+ir); }
virtual void resize(size_t nr, size_t nc, T value=T())
{
vec->resize(nr*nc, value);
nrow = nr;
ncol = nc;
}
Matrix &operator =(const Matrix &mat);
Matrix operator +(const Matrix &mat) const;
Matrix operator -(const Matrix &mat) const;
};
template<class T>
class SqMatrix: public Matrix<T> {
private:
size_t ndim;
public:
SqMatrix(): Matrix<T>(), ndim(0) {}
SqMatrix(size_t nd, T value=T()): Matrix<T>(nd, nd, value), ndim(nd) {}
size_t getndim() const
{ return ndim; }
virtual void resize(size_t nd, T value=T())
{
Matrix<T>::resize(nd, nd, value);
ndim = nd;
}
SqMatrix &operator =(const SqMatrix &sqmat)
{
Matrix<T>::operator =(sqmat);
return *this;
}
};
#endif
然后是我的方法实现,matrix。cpp
#include <iostream>
#include <cstring>
#include <string>
#include <typeinfo>
#include "precision.h"
#include "matrix.h"
#include "lapack.h"
template<class T>
Matrix<T> &Matrix<T>::operator =(const Matrix<T> &mat)
{
try {
if(nrow != mat.nrow) throw "Matrix::operator =: Invalid mat.nrow";
if(ncol != mat.ncol) throw "Matrix::operator =: Invalid mat.ncol";
}
catch(const char *str) {
std::cout << str << std::endl;
}
memcpy(vec->data(), mat.vec->data(), sizeof(T)*nrow*ncol);
return *this;
}
template<class T>
Matrix<T> Matrix<T>::operator +(const Matrix<T> &mat) const
{
try {
if(nrow != mat.nrow) throw "Matrix::operator +: Invalid mat.nrow";
if(ncol != mat.ncol) throw "Matrix::operator +: Invalid mat.ncol";
}
catch(const char *str) {
std::cout << str << std::endl;
}
Matrix<T> matsum(nrow, ncol);
for(size_t i = 0; i < nrow*ncol; ++i)
matsum.vec->at(i) = vec->at(i) + mat.vec->at(i);
return matsum;
}
template<class T>
Matrix<T> Matrix<T>::operator -(const Matrix<T> &mat) const
{
try {
if(nrow != mat.nrow) throw "Matrix::operator -: Invalid mat.nrow";
if(ncol != mat.ncol) throw "Matrix::operator -: Invalid mat.ncol";
}
catch(const char *str) {
std::cout << str << std::endl;
}
Matrix<T> matdif(nrow, ncol);
for(size_t i = 0; i < nrow*ncol; ++i)
matdif.vec->at(i) = vec->at(i) - mat.vec->at(i);
return matdif;
}
template Matrix<dreal> &Matrix<dreal>::operator =(const Matrix<dreal> &);
template Matrix<dreal> Matrix<dreal>::operator +(const Matrix<dreal> &) const;
template Matrix<dreal> Matrix<dreal>::operator -(const Matrix<dreal> &) const;
template Matrix<dcmplx> &Matrix<dcmplx>::operator =(const Matrix<dcmplx> &);
template Matrix<dcmplx> Matrix<dcmplx>::operator +(const Matrix<dcmplx> &) const;
template Matrix<dcmplx> Matrix<dcmplx>::operator -(const Matrix<dcmplx> &) const;
最后是主代码test.cpp
#include <iostream>
#include <typeinfo>
#include "constants.h"
#include "matrix.h"
using namespace std;
using namespace constants;
int main()
{
const size_t Ndim(7);
SqMatrix<dreal> sqmatA(Ndim,Ndim), sqmatB(Ndim,Ndim), sqmatC(Ndim,Ndim);
for(size_t i = 0; i < Ndim; ++i)
for(size_t j = 0; j < Ndim; ++j) {
sqmatA.at(j, i) = (i+1) * (j+1);
sqmatB.at(j, i) = i + j;
}
sqmatC = sqmatA + sqmatB;
return 0;
}
奇怪的是编译器报错:
test.cpp: In function ‘int main()’:
test.cpp:20: error: no match for ‘operator=’ in ‘sqmatC = Matrix<T>::operator+(const Matrix<T>&) const [with T = double](((const Matrix<double>&)((const Matrix<double>*)(& sqmatB.SqMatrix<double>::<anonymous>))))’
matrix.h:62: note: candidates are: SqMatrix<T>& SqMatrix<T>::operator=(const SqMatrix<T>&) [with T = double]
显然,这是由于派生类SqMatrix的操作符=。我实际上为SqMatrix实现了operator =,为什么它仍然抱怨,或者我犯了什么实际的错误?
提前感谢!
易您的子类SqMatrix
中缺少operator+
。这就是为什么您的矩阵和sqmatA + sqmatB
使用通用类Matrix
的operator+
,它返回Matrix
,因此不能传递到您的子类SqMatrix
中的特定operator=
。
对于编译错误:
'+'操作符返回一个'Matrix'类的对象。您没有在'SqMatrix'中定义一个接受'Matrix'对象的赋值运算符。
另一方面,使方阵成为矩阵的子类可能是也可能不是最好的主意:
- 你携带了一个多余的成员变量(ndim),而不是方阵是维度和数据,它的维度,数据,和继承的x和y维度
- 没有矩阵重载的方法来利用方形
- 你创造了歧义-一个人可以创建一个正常的矩阵,它是平方(因为它碰巧有相同的x &y维)
作为一个方阵比作为一个矩阵的(计算的)属性更好。
相关文章:
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 无异常的c++操作符重载错误检查
- Assert()函数抛出一个错误——操作符有问题
- c++操作符string和char*导致歧义错误
- 模板结构中的友元操作符引发重定义错误
- 指针上的操作符=可能导致mac上的分段错误
- 错误:没有找到接受右QUdpSocket的操作符
- 内部编译器错误-开关表达式中的模板化转换操作符
- c++中重载*操作符编译错误
- 重载操作符类型错误
- 赋值操作符重载:错误处理场景
- const_iterator上的间接操作符错误
- 使用重载复合赋值操作符时的运行时错误
- 类型转换操作符重载——Visual studio 2013内部错误
- 显式操作符bool未在lambda内部调用- MSVC错误
- 派生类操作符=错误
- I/O流操作符和前/后递增/递减操作符重载错误
- Boost::bind重载操作符导致Boost未定义引用错误
- 遇到错误:没有匹配操作符[]
- 错误:操作符重载++/——等时需要左值