我有一个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

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

3回复

方括号重载=>没有运算符匹配操作数

我目前在重载自定义矢量类中的方括号时遇到了一些麻烦。 我的课基本上看起来像这样: 在此类函数中,我可以调用(* this)[0],一切正常。 现在,我遇到的问题是类的成员如下: 问题是我的编译器对我说了一个错误 没有运算符“ []”与这些操作数匹配 操作
2回复

C ++重载运算符和const

以下代码返回此错误: main.cpp | 80 |错误:将'const矩阵'作为'T&matrix :: at(size_t,size_t)的'this'参数传递[with T = int,size_t = long unsigned int]'丢弃限定符[-fpermissive]
2回复

运算符<重载错误,操作数无效

当我尝试使用这样的代码时: 我收到一个错误: (在lower_bound的实现中使用指向<比较的指针。)那么,当我向operator<提供这些操作数时,为什么它们无效? 如果我改用比较函子, 然后编译。 我可以那样做,但是我想知道为什么第一次尝试失败了
4回复

定义模板运算符重载时出错

这是一个尝试的operator +模板重载。 无法同时使用gcc 4.8和icc 14.0.3进行编译。 但是,注释的重载可以正常工作。 有什么区别? 为什么带有两个参数的模板不匹配?
1回复

链表时= =运算符重载的意义

我试图在C ++中的链表中重载=运算符,并编写了以下代码。 我编写此代码只是为了练习模板,指针和运算符重载,但我想知道在这种情况下=运算符的重要性。 就好像我用它一样 现在,L1中反映的任何更改都将反映在L2中,因此我们可以做的不是 这也将解决上述目的。 那么,为什么
1回复

仅当类型具有“<<”运算符时才重载?

我有一个为许多类型重载的函数。 但我目前的问题是由于(LWS在这里: lws ): 我的问题是,当我们为std::tuple调用f() ,第三个版本被执行而不是第二个版本。 如何解决这个问题(一个解决方案是允许第三个版本仅用于定义<<类型,但我不知道如何做到这一点,如
2回复

使用模板重载+运算符

嘿,我收到链接器错误LNK2019:尝试使用重载+运算符时未解析的外部符号。 我会告诉你从课堂上剪掉它,以及我是如何使用它的。 如果你需要了解更多,请告诉我,我只是想让事情变得简洁。 请注意,我也有[]重载,所以我只是用它来访问部分m_index。 getIndex()只返回m_i
1回复

类继承和运算符重载

我正在通过SFML上的一个小项目来学习C ++,我想扩展sf::Vector2<T>类,该类表示2D数学向量。 此类的声明在此处提供 。 特别是,我想向类中添加一些方法,用于范数计算,旋转等。 这是我到目前为止所拥有的: 在代码的后面,我声明了这样的结构:
2回复

带有模板的重载运算符()

我正在做一个需要使用模板完成的作业:这是一个矩阵类。 一种告诉我重载operator ()(int r, int c); ,因此我可以使用obj(a, b);访问我的数据 或将其更改为obj(a, b)=100; 。 我班的template<class T, int C,
3回复

运算符重载模板

我有一个类必须能够保持一种浮动,双重,长的异常。 我想以这样的方式重载它,它可以添加两个持有不同类型的实例。 这只是伪代码我已经保留了无关的位,我实际上试图使用这种解决方案。 现在尝试使用时: 我可以看出为什么这不起作用,因为它假设rhs参数与lhs的类型相同。 我还可