1

我有一个类模板,它有一个提升矩阵作为私有成员变量。矩阵数据类型由构造时的类类型决定。这个类有一个成员函数,应该向成员矩阵添加一个常量。该常数与矩阵数据类型一致。我在编写一个重载运算符时遇到问题,它将为任意常量值返回一个更新的成员矩阵。目前,另一个成员函数执行此添加。我的代码如下;

/*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; 
} 

我得到的一些编译器错误是

错误:主模板声明中的模板 ID 'operator+<>'

错误:'((MTool*)this)->MTool::m_ME += k'中的'operator+='不匹配</p>

我对 C++ 模板和类相当陌生,并且确信我的方法中缺少一些基本的东西。任何建议将不胜感激。

4

1 回答 1

0

第一个只是一个语法错误,这个成员 operator+ 将被写为

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

尽管将二进制加号运算符视为成员函数有点不寻常:它几乎总是作为非成员实现,因此您可以编写表达式c + M以及M + c.

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

加法只在形状相同的矩阵之间定义。如果要将标量添加到矩阵的每个元素,则需要编写如下内容:

void AddConst(const T &k) {
    for(auto& element : m_ME.data())
           element += k;
}
于 2012-10-16T03:20:45.110 回答