当前位置: 首页 > 知识库问答 >
问题:

c重载运算符和常量

厍兴腾
2023-03-14

以下代码返回此错误:

主要的cpp | 80 |错误:将“const matrix”作为“T”的“this”参数传递

有什么想法为什么以及如何修复它吗?

#include <vector>

template <typename T>
class matrix
{
    std::vector< std::vector<T> > data;
    size_t N, M;    
public:
        T& at(size_t x, size_t y);
        matrix<T> operator+(const matrix<T>& m2) const;
};

template<class T>
T& matrix<T>::at(size_t x, size_t y)
{ return data[x][y]; }

template<class T>
matrix<T> matrix<T>::operator+(const matrix<T>& m2) const
{    
    matrix<T> res; //initialization of internals not related to error
    for(unsigned int i=0; i<N; ++i)
        for(unsigned int j=0; j<M; ++j)
            res.at(i,j) = this->at(i, j) + m2.at(i, j);    
    return res;
}

int main()
{
    matrix<int> a, b; //initialization of internals not related to error
    a = a + b;
    return 0;
}

http://ideone.com/5OigTP

共有2个答案

沙靖琪
2023-03-14

您是否尝试过为at()添加常量重载???

如在:

const T& at(size_t x, size_t y) const;
姬安志
2023-03-14

对于常量矩阵,需要在处重载

template<class T>
const T& matrix<T>::at(size_t x, size_t y) const
{
    return data[x][y];
}
 类似资料:
  • C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 C++ 中的函数重载

  • 主要内容:运算符重载的实现,可重载与不可重载的运算符C# 中支持运算符重载,所谓运算符重载就是我们可以使用自定义类型来重新定义 C# 中大多数运算符的功能。运算符重载需要通过 operator 关键字后跟运算符的形式来定义的,我们可以将被重新定义的运算符看作是具有特殊名称的函数,与其他函数一样,该函数也有返回值类型和参数列表,如下例所示: public static Box operator+ (Box b, Box c) {     Box bo

  • 本文向大家介绍c++ *运算符重载,包括了c++ *运算符重载的使用技巧和注意事项,需要的朋友参考一下 运算符重载,对象和指向对象的指针 直接上code 运行结果: t是指向test对象的指针,(*t) 也就是一个test对象。 所以只有 *t才真正的调用了 运算符的重载函数。

  • 我试图重载结构中映射的运算符<<,但得到一个编译错误: 不存在从“std::_rb_tree_const_iterator >”到“std::_rb_tree_iterator >”的合适的用户定义转换

  • 对于一个作业,学生们必须制作一个卡片结构来保存卡片的花色、等级和位图。此结构需要一个重载的" 然而,操作员 事先非常感谢。

  • 我正在构建一个关于有理数的C++项目。我已经定义了一个名为RationalNumber的类,它包含了构造函数和算术(+,-,*,/)运算符、关系(<,>,<=,>=)运算符和相等(==,!=)运算符的重载,还有>>运算符。我有两个私有属性:分子和分母(整数)。现在,我有个问题!为了返回两个RationalNumber对象中较大的指针,可以重新重载operator>?如果是,我该怎么做? 我就这样试