c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?

标签 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(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;

问题行似乎需要 HelperIndex2 构造函数中的 const Volume& p,我想这是有道理的,因为我正试图在其他地方使用 const Chunk - 但我不知道如何解决这个问题。如果我添加第二个构造函数,我是否应该维护两个父引用,一个是常量,另一个不是?我担心这会膨胀成一团糟。如果有人能解释处理这种情况的正确方法,我将不胜感激。

最佳答案

您不会绕过维护两组代理类。这完全类似于标准库容器的 iteratorconst_iterator 嵌套类。

由于您要返回代理类的拷贝,因此包含对原始对象的可变引用的代理类不可能也用于对原始对象的仅常量访问,因此您无法绕过一些 两种方法。两者的语义不同:如果您拥有的只是代理类的一个实例,您必须能够知道它是允许修改访问还是只允许只读访问。

关于c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466730/

相关文章:

php - 从 CodeIgniter 中的 View 检查 session

c++ - 如何针对程序相似的不同数据类型专门化模板函数?

c++ - dylib 中的重载运算符删除替换了 OSX 中的系统运算符

c++ - 如何用复数和多态重载运算符?

c++ - C++中运算符重载的返回值

c++ - C/C++ 高效sock反向代理

c++ - 将 C++ 项目升级到 VS2015,但链接器仍在寻找 VC100 Boost 库

c++ - 在测试中检查对象的类型是公认的做法吗?

C# 到 C++ 数组?

C++ 模板挑战