【问题标题】:Expression must be a modifiable lValue: `(x, y) = 0;`表达式必须是可修改的 lValue:`(x, y) = 0;`
【发布时间】:2016-12-20 19:23:20
【问题描述】:

我有一个模板类 Array,它实现了一个二维数组。数组类包含一个重载的运算符 (),它返回对从零开始的位置(第 x 列,第 y 行)处的元素的引用:

const T & operator () (int x, int y) const {
        size_t loc = y*width + x;
        return *(buffer + loc);
    }

我还有一个派生类图像,它表示 ppm 图像的通用数据容器。图像类包含一个 setPixel 方法,该方法设置 (x,y) 像素的 RGB 值:

void setPixel(unsigned int x, unsigned int y) {     
            size_t locpixel = y*width + x;
            size_t componentofpixel = locpixel * 3;
            (x, y) = 0;
            (x, y) + 1 = 1;
            (x, y) + 2 = 0;
    }

所以当我编译时它在 setPixel 中显示一个错误,即表达式必须是可修改的 lValue。有什么方法可以在我的 setPixel 方法中使用操作符 () 来获取数组中的下一个元素?

【问题讨论】:

  • 您希望(x, y) 打电话给您的operator ()吗?
  • 这就是我想做的事情
  • 您需要一个实例来调用操作员。试试(*this)(x, y) ...

标签: c++ arrays


【解决方案1】:

与成员函数不同,运算符需要有一个实例才能使用。现在,当您执行(x, y) 时,您调用逗号运算符,编译器计算表达式x,丢弃它,然后计算表达式y 并返回产生的结果。该返回值是一个临时值,您不能分配给它,因为它是一个内置的 int 类型。

为了调用函数调用操作符,你需要给它一个实例来调用它。在这种情况下,您可以使用

(*this)(x, y) = 0;
(*this)(x, y) + 1 = 1;
(*this)(x, y) + 2 = 0;

这现在解决为调用您为类型定义的operator()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2019-06-28
    • 2020-07-07
    • 2017-08-27
    • 2021-09-17
    • 2014-12-15
    • 2014-12-20
    • 2015-09-19
    相关资源
    最近更新 更多