我有一个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-但我不知道如何解决此问题。 如果我添加第二个构造函数,是否应该维护两个父引用,一个是常量,另一个是不常量? 我担心这会变得一团糟。 如果有人能解释处理这种情况的正确方法,我将不胜感激。

===============>>#1 票数:1 已采纳

您将无法维护两组代理类。 这完全类似于标准库容器的iteratorconst_iterator嵌套类。

既然你正在返回代理类的副本,包含可变引用原始对象的代理类不可能也可用于恒定只有原来的对象访问,所以你不能左右某种双重方法得到。 两者的语义不同:如果您拥有的只是代理类的一个实例,则您必须能够知道它是否允许变异访问或仅允许只读访问。

  ask by Xavier translate from so

未解决问题?本站智能推荐: