Operator overloading for a class containing boost::numeric::ublas::matrix
我有一个类模板,它有一个boost矩阵作为私有成员变量。矩阵数据类型在构造时由类类型确定。这个类有一个成员函数,它应该向成员矩阵中添加一个常量。常量与矩阵数据类型一致。我在编写重载运算符时遇到问题,该运算符将为任意常量值返回更新的成员矩阵。当前,另一个成员函数执行此添加操作。我的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /*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; } |
我得到的一些编译器错误是
error: template-id ‘operator+<>’ in declaration of primary template
error: no match for ‘operator+=’ in ‘((MTool*)this)->MTool::m_ME += k’
号
我对C++模板和类很陌生,并且确信从我的方法中有一些基本的缺失。任何建议都将受到高度赞赏。
第一个只是语法错误,此成员运算符+将被写入
1 | MTool<T> operator+ (const T& kvalue) const { ... |
虽然将binary plus运算符视为成员函数有些不寻常:它几乎总是作为非成员实现的,因此可以编写表达式
第二个错误只是指出,
加法只在等形状的矩阵之间定义。如果要将标量添加到矩阵的每一个元素中,需要编写它,比如:
1 2 3 4 | void AddConst(const T &k) { for(auto& element : m_ME.data()) element += k; } |
号