C++ 当操作的变量为const时,如何修复括号/索引运算符重载?
我有一个3D数组的模板,但是当Chunk类型的变量(参见下面的typedef)尝试进行索引访问时,我在编译时遇到问题C++ 当操作的变量为const时,如何修复括号/索引运算符重载?,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我有一个3D数组的模板,但是当Chunk类型的变量(参见下面的typedef)尝试进行索引访问时,我在编译时遇到问题 template <typename T, int xMax, int yMax, int zMax> class Volume { public: class HelperIndex3 { public: HelperIndex3(Volume& p, int xx, int yy) : parent(p), x(xx), y
template <typename T, int xMax, int yMax, int zMax>
class Volume {
public:
class HelperIndex3 {
public:
HelperIndex3(Volume& p, int xx, int yy) : parent(p), x(xx), y(yy) {}
T operator[] (int z) const {return parent.data[x][y][z];}
T& operator[] (int z) {return parent.data[x][y][z];}
private:
Volume& parent;
int x;
int y;
};
class HelperIndex2 {
public:
HelperIndex2(Volume& p, int xx) : parent(p), x(xx) {}
HelperIndex3 operator[] (int y) const {return HelperIndex3(parent, x, y);}
HelperIndex3 operator[] (int y) {return HelperIndex3(parent, x, y);}
private:
Volume& parent;
int x;
};
HelperIndex2 operator[] (int x) const {return HelperIndex2(*this, x);} //problem at this line
HelperIndex2 operator[] (int x) {return HelperIndex2(*this, x);}
private:
T data[xMax][yMax][zMax];
};
typedef Volume<unsigned char, 64, 64, 64> Chunk;
模板
班级数量{
公众:
类助手索引3{
公众:
HelperIndex3(Volume&p,intxx,intyy):父(p),x(xx),y(yy){
T运算符[](int z)常量{return parent.data[x][y][z];}
T&运算符[](int z){返回父.data[x][y][z];}
私人:
数量和母公司;
int x;
int-y;
};
类帮助器索引2{
公众:
HelperIndex2(卷和页,int-xx):父(p),x(xx){}
HelperIndex3运算符[](int y)常量{return HelperIndex3(parent,x,y);}
HelperIndex3运算符[](int y){return HelperIndex3(parent,x,y);}
私人:
数量和母公司;
int x;
};
HelperIndex2运算符[](int x)const{return HelperIndex2(*this,x);}//此行出现问题
HelperIndex2运算符[](int x){return HelperIndex2(*this,x);}
私人:
T数据[xMax][yMax][zMax];
};
typedef卷块;
问题行似乎需要HelperIndex2构造函数中的const Volume&p,我想这是有意义的,因为我试图在其他地方使用const块,但我不知道如何解决这个问题。如果我添加第二个构造函数,我应该维护两个父引用吗?一个是常量,另一个不是常量?我担心这会变得一团糟。如果有人能解释处理这种情况的正确方法,我将不胜感激。您将无法回避维护两组代理类。这完全类似于标准库容器的
迭代器
和常量迭代器
嵌套类
由于您要返回代理类的副本,因此包含对原始对象的可变引用的代理类也不可能用于对原始对象的仅常量访问,因此您无法绕过某种双重方法。这两个类的语义是不同的:如果您只拥有代理类的一个实例,那么您必须能够知道它是允许变异还是只允许只读访问。一个好方法是创建助手索引类的常量版本吗?@Xavier:是的,这听起来很合理,也很直截了当。