Я пытаюсь реализовать векторные и матричные шаблоны выражений. У обоих есть оператор + перегрузка, но я получаю неоднозначную ошибку оператора.
Как я могу перегрузить операторы для матрицы и вектора, сохраняя эффекты шаблонов выражений?
Вот мой матричный шаблон суммы:
template<typename E1, typename E2>
class MatSum: public MatExpression<MatSum<E1,E2>>{
E1 const& _u;
E2 const& _v;
public:
MatSum(E1 const &u, E2 const &v): _u(u), _v(v){
assert(u.height() == v.height() && u.width() == v.width());
}
double operator[](size_t i) const {return _u[i] + _v[i]; }
size_t size() const {return _u.size();}
size_t width() const {return _u.width();}
size_t height() const {return _u.height();}
};
template<typename E1, typename E2>
MatSum<E1,E2> operator+(E1 const& u, E2 const& v){
return MatSum<E1,E2>(u,v);
}
и вот шаблон векторной суммы:
template <typename E1, typename E2>
class VecSum : public VecExpression<VecSum<E1, E2>>{
E1 const& _u;
E2 const& _v;
public:
VecSum(E1 const & u, E2 const &v): _u(u), _v(v){
assert(u.size() == v.size());
}
double operator[](size_t i) const {return _u[i] + _v[i]; }
size_t size() const {return _v.size(); }
};
template <typename E1, typename E2>
VecSum<E1, E2> operator+(E1 const &u, E2 const &v){
return VecSum<E1,E2>(u,v);
}
И кусок кода, который вызывает ошибку:
Vec v1 = {67.12,34.8,90.34};
Vec v2 = {34.90,111.9,45.12};
Vec sum = v1+v2;
Matrix m0 = {{1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,1.0,1.0}};
Matrix m1 = {{1.0,1.0,1.0},{1.0,1.0,1.0},{1.0,1.0,1.0}};
Matrix summ = m0 + m0;