我必须制作一个与矩阵一起工作的学校项目。在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;
}
服务器中的编译器是带有-static -O2参数的g ++。 我得到的错误如下:
/var/www/F/I704e/3/1/teszt1.cpp:在函数'int main()'中:
/var/www/F/I704e/3/1/teszt1.cpp:42:错误:'operator +'中的'operator +'不匹配(const my_matrix&amp;,const my_matrixAdd&amp;)[与T = int,int N = 5,int M = 3,LeftOp = my_matrix,RightOp = my_matrix]((const my_matrixAdd,my_matrix&gt;&amp;)((const my_matrixAdd,my_matrix&gt; *)(&amp; operator +(const my_matrix&amp;,const my_matrix&amp;); )[用T = int,int N = 5,int M = 3](((const my_matrix&amp;)((const my_matrix *)(&amp; mtx3))))))))+ operator +(const my_matrixAdd&amp;,const my_matrix&amp;)[T = int,int N = 5,int M = 3,LeftOp = my_matrix,RightOp = my_matrix](((const my_matrix&amp;)((const my_matrix *)(&amp; mtx6))))'< / p>
并且喜欢:
包含在/var/www/F/I704e/3/1/teszt1.cpp:6中的文件:
/var/www/Hallg/I704e/3/h145172/7/feladat.cpp:在函数'my_matrixAdd,my_matrixAdd&gt; operator +(const my_matrixAdd&amp;,const my_matrixAdd&amp;)[with T = int,int N = 5,int M = 3,LeftOp = my_matrix,RightOp = my_matrix]':
请帮帮我!谢谢!
答案 0 :(得分:0)
这是一个扩展评论。
以下是我对你问题中所有不需要的东西的剥离:
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;
}
请注意,此版本也无法编译。然而,原因更明显。
你应该将你的代码剥离到这样的东西,或者请求帮助理解为什么还有错误,修复它(或者注意不再存在问题),然后一次一步地重新构建它
你会注意到这些类不再做任何事了 - 这很好,因为类型错误不是由远程代码造成的。 (最糟糕的是,它是由他们的签名造成的,我保持不变)。