Матрица c ++ с проблемами шаблона Expression

Я должен сделать школьный проект, который работает с матрицами. В Visual Studio 2010 все отлично работает. На сервере тестера есть «matrix_base» и основная функция, например:

template<class T,  int N,  int M,  class LeftOp,  class RightOp> class my_matrixAdd;
template<class T,  int N,  int M,  class LeftOp,  class RightOp> class my_matrixSub;
template<class T,  int N,  int M,  class LeftOp,  class RightOp> class my_matrixMul;

template<class T,  int N,  int M>
class my_matrix //: matrix_base
{
private:
T arrData[N][M];
int columns;
int rows;
public:

my_matrix() : columns(N), rows(M) {}
template<class LeftOp,  class RightOp>
my_matrix<T, N, M> & operator=(
const my_matrixAdd<T, N, M, LeftOp, RightOp> & mx)
{
for(int i=0; i<N; ++i)
for(int j=0; j<M; ++j)
{
At(i, j) = mx.At(i, j);
}
return *this;
}

template<class LeftOp,  class RightOp>
my_matrix<T, N, M> & operator=(
const my_matrixMul<T, N, M, LeftOp, RightOp> & mx)
{
for(int i=0; i<N; ++i)
for(int j=0; j<M; ++j)
{
At(i, j) = mx.At(i, j);
}
return *this;
}

template<class LeftOp,  class RightOp>
my_matrix<T, N, M> & operator=(
const my_matrixSub<T, N, M, LeftOp, RightOp> & mx)
{
for(int i=0; i<N; ++i)
for(int j=0; j<M; ++j)
{
At(i, j) = mx.At(i, j);
}
return *this;
}

virtual ~my_matrix() {}
const T& At(int n,  int m) const
{
return arrData[n][m];
}
T& At(int n,  int m)
{
return arrData[n][m];
}

const T& operator()(int n,  int m) const
{
return arrData[n][m];
};

T& operator()(int n,  int m)
{
return arrData[n][m];
};int Columns() const { return columns; }
int Rows()    const { return rows;    }

};

template< class T,  int N,  int M,  class LeftOp,  class RightOp>
class my_matrixAdd
{
private:
const LeftOp& m_lhs;
const RightOp& m_rhs;
public:
my_matrixAdd(
const LeftOp& lhs,  const RightOp& rhs) :
m_lhs(lhs),  m_rhs(rhs) {}
T At(int x,  int y) const
{
return m_lhs.At(x,  y) + m_rhs.At(x,  y);
}
};template<class T,  int N,  int M>
inline my_matrixAdd<T, N, M, my_matrix<T, N, M> , my_matrix<T, N, M>  >
operator+(const my_matrix<T, N, M>  &l,  const my_matrix<T, N, M>  &r)
{
return my_matrixAdd<T, N, M, my_matrix<T, N, M> ,
my_matrix<T, N, M>  > (l, r);
}

template<class T,  int N,  int M,  class LeftOp,  class RightOp>
inline my_matrixAdd<T, N, M, my_matrixAdd<T, N, M, LeftOp, RightOp> ,
my_matrix<T, N, M>  >
operator+(const my_matrixAdd<T, N, M, LeftOp, RightOp>  &l,
const my_matrix<T, N, M>  &r)
{
return my_matrixAdd<T, N, M, my_matrixAdd<T, N, M, LeftOp, RightOp> ,
my_matrix<T, N, M>  > (l, r);
}

template<class T,  int N,  int M,  class LeftOp,  class RightOp>
inline my_matrixAdd<T, N, M, my_matrixSub<T, N, M, LeftOp, RightOp> ,
my_matrix<T, N, M>  >
operator+(const my_matrixSub<T, N, M, LeftOp, RightOp>  &l,
const my_matrix<T, N, M>  &r)
{
return my_matrixAdd<T, N, M, my_matrixSub<T, N, M, LeftOp, RightOp> ,
my_matrix<T, N, M>  > (l, r);
}

int main()
{
my_matrix<int,2,2> mtx1;
my_matrix<int,2,2> mtx2;
my_matrix<int,2,2> mtx3;
my_matrix<int,2,2> mtx4;
mtx4 = mtx1 + mtx2 + mtx3;
return 0;
}

Компилятор на сервере — это g ++ с параметрами -static -O2.
И я получаю ошибки, такие как:

/var/www/F/I704e/3/1/teszt1.cpp: в функции int main ():

/var/www/F/I704e/3/1/teszt1.cpp:42: ошибка: нет совпадения для «operator +» в «operator +» (const my_matrix&, const my_matrixAdd&) [с T = int, int N = 5, int M = 3, LeftOp = my_matrix, RightOp = my_matrix] (((const my_matrixAdd, my_matrix>&) ((const my_matrixAdd, my_matrix> *) (& оператор + (const my_matrix&, const my_matrix&) [с T = int, int N = 5, int M = 3] (((const my_matrix&) ((const my_matrix *) (& mtx3)))))))) + оператор + (const my_matrixAdd&, const my_matrix&) [с T = int, int N = 5, int M = 3, LeftOp = my_matrix, RightOp = my_matrix] (((const my_matrix&) ((const my_matrix *) (& mtx6))))

И как:

В файле, включенном в /var/www/F/I704e/3/1/teszt1.cpp:6:

/var/www/Hallg/I704e/3/h145172/7/feladat.cpp: в функции ‘my_matrixAdd, my_matrixAdd> operator + (const my_matrixAdd&, const my_matrixAdd&) [с T = int, int N = 5, int M = 3, LeftOp = my_matrix, RightOp = my_matrix] ’:

Пожалуйста, помогите мне! Благодарю вас!

-3

Решение

Это расширенный комментарий.

Вот мое снятие всех ненужных вещей в вашем вопросе:

template<class LeftOp,  class RightOp>
class my_matrixAdd;

struct matrix_base {};

class my_matrix : matrix_base
{
public:
my_matrix() {}
template<class LeftOp,  class RightOp>
my_matrix & operator=(const my_matrixAdd<LeftOp, RightOp> & mx) {
return *this;
}

virtual ~my_matrix() {}
};

template< class LeftOp,  class RightOp>
class my_matrixAdd
{
private:
const LeftOp& m_lhs;
const RightOp& m_rhs;
public:
my_matrixAdd(const LeftOp& lhs,  const RightOp& rhs) : m_lhs(lhs),  m_rhs(rhs) {}
};inline my_matrixAdd<my_matrix , my_matrix  >
operator+(const my_matrix  &l,  const my_matrix  &r) {
return my_matrixAdd<my_matrix, my_matrix > (l, r);
}

template<class LeftOp,  class RightOp>
inline my_matrixAdd<my_matrixAdd<LeftOp, RightOp> , my_matrix  >
operator+(const my_matrixAdd<LeftOp, RightOp>  &l,  const my_matrix  &r) {
return my_matrixAdd<my_matrixAdd<LeftOp, RightOp>, my_matrix>(l, r);
}
#include <utility>
int main() {
my_matrix mtx1;
my_matrix mtx2;
my_matrix mtx3;
my_matrix mtx4;

// really, we should figure out what type these are explicitly, instead of using auto:
auto&& tmp1 = mtx1 + mtx2;
auto&& tmp2 = std::move(tmp1) + mtx3;
mtx4 = std::move(tmp2);
auto&& tmp3 = mtx2 + mtx3;
auto&& tmp4 = mtx1 + std::move(tmp3);
mtx4 = std::move(tmp4);

return 0;
}

обратите внимание, что эта версия также не компилируется. Однако причина более очевидна.

Вы должны свести свой код к чему-то вроде этого, либо попросить помощи в понимании, почему все еще возникает ошибка, исправить ее (или заметить, что проблемы больше нет), а затем создать ее обратно по одному шагу за раз.

Вы заметите, что классы больше ничего не делают — это хорошо, потому что ошибка типа не вызвана тем, что делает удаленный код. (в худшем случае это вызвано их подписью, которую я оставил без изменений).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]