2017-01-30 47 views
-5

我不完全确定为什么我得到这个消息,考虑到方括号不是一个运算符,但在这里,我们走了。没有匹配运算符[] C++

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

任何方向,我应该如何解决这个问题?

+0

的std ::集没有const的operator []的过载能力:用户.AT()函数,而不是 – zapredelom

+0

你必须重载'INTSET ::运算符[]'因为你要拨打运营商'[]'就可以了。 – songyuanyao

+0

运算符重载不允许以任何形式。我也不能更改类方法声明或参数。 – Podo

回答

0

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

2

我看着重载操作符,但方括号似乎不可重载。

他们绝对是!

所以你的这句话意味着你的IntSet类没有一个[]括号运算符,但你使用它。错误信息正好说明了这一点;所以这是你的问题。

+0

运营商超载不允许以任何形式:/ – Podo

+1

@JeffreyDilley什么?!这根本没有意义。你是否编程C++? –

+0

对此特定代码的限制。这是我为离散数学课程开发的一个更大的项目的一小部分。 – Podo

1

您必须“忘记”重载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如果需要来自非会员的访问)。

+0

我只是想知道,我是否应该包含整个.h文件和.cpp文件?他们很长,我觉得我发布了重要的信息。包括这样的问题会有帮助吗? – Podo

+0

你应该包含你的.h和.cpp文件中需要重现问题的部分,没有什么比这更重要。这包括将所有相关类的定义降至最低要求。 – Walter

+0

为什么要公开?它可以在成员函数中访问? – StoryTeller