C++ 重载[]运算符:必须是非静态成员函数

C++ 重载[]运算符:必须是非静态成员函数,c++,algorithm,operator-overloading,C++,Algorithm,Operator Overloading,我正在处理图形,并编写一些著名算法的代码。目前我正在研究Dijkstra算法 因此,我创建了自己的堆类,该类用作Dijkstra算法实现的最小优先级队列。因为,在Dijkstra算法中,如果顶点(已经在堆中)的距离小于其当前距离,则需要更新其与图形中源顶点的距离,然后相应地调整堆中的值 为此,我需要保留一个int position[]数组来跟踪元素当前在堆中的位置 这是我的顶点类:: class Node{ public: int data; in

我正在处理图形,并编写一些著名算法的代码。目前我正在研究Dijkstra算法

因此,我创建了自己的
类,该类用作Dijkstra算法实现的最小优先级队列。因为,在Dijkstra算法中,如果顶点(已经在堆中)的距离小于其当前距离,则需要更新其与图形中源顶点的距离,然后相应地调整堆中的值

为此,我需要保留一个
int position[]
数组来跟踪元素当前在
堆中的位置

这是我的顶点类::

    class Node{
    public:
        int data;
        int weight;

        .....

        friend int& operator [](int *a, Node i) {
            return a[i.data];
        }
    };
My
minPriorityQueue
class::

template <typename t>
class minPriorityQueue {
    int size, currentPosition;
    int *position;
    t *data;
    bool (*compare)(t data1, t data2);
public:
    minPriorityQueue(int size, bool (*func1)(t data1, t data2), int *position) {
        this->size = size;
        currentPosition = 1;
        data = new t[size];
        compare = func1;
        this->position = position;
    }

   ........

    void swapPositionValue(int parent, int temp) {
        int tempPosition = position[data[parent]];
        position[data[parent]] = position[data[temp]];
        position[data[temp]] = tempPosition;
    }    

    ......
};
然后,整个“通用”优先级队列的想法将被牺牲!因为,它不适用于其他类

有没有办法实现这个功能

EDIT1::完整代码: (使用Ideone粘贴代码,因为代码仍然很大,包含2个类)

这就是我努力实现的目标: (我只是在使用算法)

解释
操作符[]
的功能: 在我的Dijkstra实现中,所有节点最初都插入到堆中,起始节点的权重为
weight=0
,所有其他节点的权重为
weight=INFINITY
(这意味着我无法到达顶点),因此起始顶点是堆的最顶层元素!现在,当我移除最上面的元素时,所有从移除的节点具有路径的
节点将被修改,它们的
权重将从
无穷大
修改为某个有限值。因此,我需要更新堆中的节点,然后根据它们的新权重将它们移动到正确的位置!!要更新它们的权重,我需要知道节点位于
堆中的什么位置,并且位置由
节点的
数据决定。因此,重载
[]操作符
对我来说只是一个小办法,这样当我执行
定位[Node]
时,我就可以访问
定位[Node.data]

为什么这不是一个重复的::链接的问题是一个广泛的运算符重载帖子,它只提到了一点,说明
[]运算符只能用成员函数重载,否则不能重载,但没有说明原因!这是我面临的一个特殊问题,我不想牺牲我自己制作的堆的泛型属性,并将其用于Dijkstra

EDIT2::在写这篇解释时,我意识到我在重载函数中犯了一个大错误。我改了!请检查一下。现在可能更有意义了道歉

重载函数现在看起来像::

friend int& operator [](int *a, Node i) {
    return a[i.data];
}
EDIT3:在使用
邻接矩阵实现我的
图形
类中,它是一个布尔2D数组,因为我当前的实现是针对未加权的图形,因此最短路径成为遍历的边数最少!(以防万一这很重要!)


感谢您阅读所有这些巨大的问题,并感谢您的帮助!:)

向我们显示导致此错误的代码。否则,我们无法告诉您它有什么问题。是的,并删除所有其他代码。顺便说一句:你想要重载它的目的是不相关的,标准库已经包含了一个堆,这可能是一个很好的替代方法。你的
操作符[]
甚至没有意义。它必须是一个成员函数,其中一个参数是调用者将放置在
[]
中的参数。你的版本有一个额外的参数
a
,它甚至没有使用,并且不是成员函数。请将第二个问题移至其他帖子。这和你的第一次完全无关。好吧,也许我了解一点你想做什么!虽然写得很随意!无论你做什么,你都不能使用操作符重载来实现,这是我可以从附加的链接和评论中看出的,因为这是不允许的!您可以尝试做的另一件事是向类传递另一个函数指针,当您需要交换位置时,只需使用所需的参数调用该函数。当您不需要它时,只需将该函数指针指定为NULL。我想这就是你需要的!
friend int& operator [](int *a, Node i) {
    return a[i.data];
}