包含 boost::numeric::ublas::matrix 的类的运算符重载
Operator overloading for a class containing 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;
}
我得到的一些编译器错误是
错误:主模板声明中的模板 ID "运算符+<>"
错误:与"((MTool*)this)->MTool::m_ME += k"中的"运算符+="不匹配
我对C++模板和类相当陌生,并且确信我的方法中缺少一些基本的东西。任何建议将不胜感激。
第一个只是一个语法错误,这个成员运算符+将写成
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;
}
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板