尝试创建一个简单的网格类,在赋值中不使用左值 我正在实现一个简单的C++网格类。它应该支持的一个函数是通过圆括号访问的,这样我就可以通过编写mygrid(0,0)来访问元素。我重载了()运算符,得到了错误消息:“赋值中的非左值”

尝试创建一个简单的网格类,在赋值中不使用左值 我正在实现一个简单的C++网格类。它应该支持的一个函数是通过圆括号访问的,这样我就可以通过编写mygrid(0,0)来访问元素。我重载了()运算符,得到了错误消息:“赋值中的非左值”,c++,grid,operators,operator-overloading,C++,Grid,Operators,Operator Overloading,我希望能够做到的是: //main cGrid<cA*> grid(5, 5); grid(0,0) = new cA(); //main cGrid网格(5,5); 网格(0,0)=新cA(); 我的网格类实现摘录: 模板 类cGrid { private: T*数据; 国际宽度; 整数mHeight; 公众: cGrid(int-width,int-height):mWidth(width),mHeight(height){ 数据=新T[宽度*高度]; } ~cGrid(

我希望能够做到的是:

//main

cGrid<cA*> grid(5, 5);

grid(0,0) = new cA();
//main
cGrid网格(5,5);
网格(0,0)=新cA();
我的网格类实现摘录:

模板 类cGrid {

private:
T*数据;
国际宽度;
整数mHeight;
公众:
cGrid(int-width,int-height):mWidth(width),mHeight(height){
数据=新T[宽度*高度];
}
~cGrid(){删除数据;}
T运算符()(整数x,整数y)
{

如果(x>=0&&x=0&&y=0&&x=0&&y此模板的作用是什么:

 T &operator ()(int x, int y) const
{
    if (x >= 0 && x <= mWidth) {
        if (y >= 0 && y <= mHeight) {
            return data[x + y * mWidth];
        }
    }
}
T&运算符()(intx,inty)常量
{
如果(x>=0&&x=0&&y=0&&x=0&&y
正如比尔所说,运算符不应该是常量。我相信这就是编译错误的原因(即使报告的错误看起来不同)。编译器只在赋值行遇到错误,因为它是一个模板类

明确地说,您不能让
const
方法返回对非
const
的引用 问题是声明
T&operator…const
是非法的。它应该是
T&operator…
const T&operator…const
。当然,您可以两者兼有


Edit:删除
常量没有任何帮助,因为现在两个方法都具有相同的签名(为了解析调用,返回类型不被视为签名的一部分)。被调用的方法是返回
t
,而不是
t&
。将其删除(或者用返回
const
引用的
const
方法替换它。)

您的变异函数可能不应该标记为const。否则,使用const cGrid您仍然可以更改其内容。网格分配:private:t*数据;public:cGrid(int-width,int-height):mWidth(width),mHeight(height){data=new T[width*height];}是的,我真的应该提出一个异常。Tydelege编译器会警告您存在退出函数而不返回值的执行路径(对于具有返回值的函数)@Ari事实上,g++和-Wall就是这样。我现在也打开了-Wall。T&operator…const为我抛出了一个错误:“…\include\Grid.h | 32 | error:T&cGrid::operator()(int,int)[with T=cA*]”和T-cGrid::operator()(int,int)[with T=cA*]”不能重载|”常量T和运算符…常量是可编译的。所以我将使用该运算符。
 T &operator ()(int x, int y) const
{
    if (x >= 0 && x <= mWidth) {
        if (y >= 0 && y <= mHeight) {
            return data[x + y * mWidth];
        }
    }
}
template <typename T>
struct Grid {
    Grid( int x, int y ) : mX(x), mY(y), mData(0) {
      mData = new T[ x * y ];
    }

    ~Grid() {
      delete [] mData;
    }

    T &operator ()(int x, int y)  {
        if (x >= 0 && x < mX) {
            if (y >= 0 && y < mY) {
                return mData[x + y * mX];
            }
        }
    throw "out of range" ;;
    }

    int mX, mY
    T * mData;
};


int main() {
    Grid <int> g(2,3);
    g(0,0) = 42;
}