Перегрузка операторов для класса, содержащего boost :: numeric :: ublas :: matrix

У меня есть шаблон класса, который имеет матрицу повышения в качестве закрытой переменной-члена. Тип данных матрицы определяется типом класса при построении. Этот класс имеет функцию-член, которая должна добавить константу в матрицу-член. Константа соответствует типу данных матрицы. У меня возникли проблемы при записи перегруженного оператора, который будет возвращать обновленную матрицу-член для произвольных постоянных значений. В настоящее время другая функция-член делает это дополнение. Мой код выглядит следующим образом;

/*content from main.cpp compiled with `g++ -o main main.cpp` */
#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace boost::numeric::ublas;
using namespace std;

template <typename T>
class MTool
{
private:
matrix<T> m_ME;

public:
MTool(int N, int M) { m_ME.resize(M, N); } // constructor
~MTool() { m_ME.clear(); } // destructor
void PutMatValues(); // insert values into member matrix
void AddConst(const T &k) { m_ME+=k; } // add a constant to member matrix
void PrintMat() { cout << "The ME " << endl << m_ME << endl; } // print the member matrix

// overloaded operator function
matrix<T> operator+ <> (const T& kvalue) { return (m_ME+kvalue); }
};

template<typename T>
void MTool<T>::PutMatValues()
{
for (unsigned row=0; row<m_ME.size1(); row++)
for (unsigned col=0; col<m_ME.size2(); col++)
m_ME(row,col)=static_cast<T> (row*col);
}

int main()
{
MTool<double> mymat(5, 3);
double dk=123.67001;

mymat.PutMatValues();
mymat.PrintMat();
mymat.AddConst(dk);
mymat.PrintMat();

return 0;
}

Некоторые ошибки компилятора, которые я получаю,

ошибка: идентификатор шаблона ‘оператор +<> ’В объявлении основного шаблона

ошибка: нет совпадения с оператором + = в in ((MTool *) this) -> MTool :: m_ME + = k ’

Я довольно плохо знаком с шаблонами и классами C ++ и уверен, что в моем подходе чего-то не хватает. Любые предложения будут высоко оценены.

1

Решение

Во-первых, это просто синтаксическая ошибка, этот оператор + член будет записан как

MTool<T> operator+ (const T& kvalue) const { ...

хотя несколько необычно видеть бинарный оператор плюс как функцию-член: он почти всегда реализован как не-член, так что вы можете писать выражения c + M так же как M + c,

Вторая ошибка просто указывает на то, что boost::numeric::ublas::matrix не имеет operator+= это принимает скалярный аргумент. Там же нет operator+ что можно добавить матрицу и скаляр, так что выражение m_ME+kvalue в вашем операторе + тоже не скомпилируется.

Сложение определяется только между матрицами одинаковой формы. Если вы добавляете скаляр к каждому элементу матрицы, вам нужно написать это, что-то вроде:

void AddConst(const T &k) {
for(auto& element : m_ME.data())
element += k;
}
0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector