关于c ++:包含boost :: numeric :: ublas :: matrix的类的运算符重载

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运算符视为成员函数有些不寻常:它几乎总是作为非成员实现的,因此可以编写表达式c + MM + c

第二个错误只是指出,boost::numeric::ublas::matrix没有采用标量参数的operator+=。也没有可以添加矩阵和标量的operator+,因此运算符+中的表达式m_ME+kvalue也不会编译。

加法只在等形状的矩阵之间定义。如果要将标量添加到矩阵的每一个元素中,需要编写它,比如:

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