运算符 [ ] 不匹配

No match for operator [ ]

鉴于方括号不是运算符,我不确定为什么会收到此消息。

在我的 IntSet.h 文件中,我声明了一个看起来像这样的特定函数。

IntSet unions(const IntSet& operand)const;

该文件由一个 IntSet 调用,将另一个 IntSet 作为参数,并且 returns 两个集合的并集。

在我的 IntSet.cpp 文件中,它看起来像这样。

IntSet IntSet::unions(const IntSet& operand) const
{
    IntSet returnSet(50);
    for (int i = 0; i < 50; i++){
        if (setArray[i] == 1 || operand[i]==1){
            if(setArray[i] == 1 ){
                returnSet.addElement(setArray[i]);
            }
            else if(operand[i] == 1){
                returnSet.addElement(operand[i]);
            }
        }
    }

    return returnSet;
}

我收到的错误来自 operand[I] == 1

IntSet.cpp|52|error: no match for 'operator[]' (operand types are 'const IntSet' and 'int')

程序不得覆盖任何运算符才能启动。我还应该提到 IntSet unions(const IntSet& operand)const; 已提供且无法更改。

关于我应该如何解决这个问题的任何方向?

I looked into overloading operators, but the square brackets don't seem to be overloadable.

他们绝对是!

所以你这句话暗示你的 IntSet class 没有 [] 括号运算符,但你使用它。错误消息正是这样说的;所以这就是你的问题。

您必须 'forgotten' 才能使 IntSet::operator[](int) const 过载。只需将其添加到您的 class 定义中:

class IntSet {
  std::unique_ptr<int[]> buffer;
/* ... */
public:
  int& operator[](int i) { return buffer[i]; }
  int  operator[](int i) const { return buffer[i]; }
};

请注意,由于您未能提供任何详细信息,我猜测您的 class IntSet 的内部结构。


如果您的任务不允许您重载运算符,那么您必须使用语言或标准库提供的运算符。在我上面的代码片段的上下文中,这意味着像在 operand.buffer[i] 中一样直接使用缓冲区的 operator[] (如果从non-members 是必需的)。

假设setArrayIntSet的成员变量,你不能为IntSet重载operator[],那么你对operand[i]的访问应该是operand.setArray[i].