与运营商[]不匹配

时间:2017-01-30 09:05:06

标签: c++ parameters

我不确定为什么我收到此消息,因为方括号不是操作员。

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

IntSet unions(const IntSet& operand)const;

该文件由IntSet调用,另一个IntSet作为参数,并返回两组的并集。

在我的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;已提供,也无法更改。

关于如何解决这个问题的方向?

3 个答案:

答案 0 :(得分:2)

  

我查看了重载操作符,但方括号似乎不会超载。

他们绝对是!

因此,您的这句话暗示您的IntSet班级没有[]括号运算符,但您使用它。错误信息恰恰说明了这一点;所以这就是你的问题。

答案 1 :(得分:1)

你必须忘记&#39;重载IntSet::operator[](int) const。只需将其添加到您的班级定义中:

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

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

如果您的任务不允许您重载运算符,则必须使用语言或标准库提供的那些。在我上面的代码段的上下文中,这意味着直接使用缓冲区operator[] operand.buffer[i](您可能需要buffer public成员,如果需要非成员访问)。

答案 2 :(得分:0)

假设.dosetArray的成员变量,并且您无法对IntSet重载operator[],那么您对IntSet的访问权限应该是{{} 1}}。