为什么我不能使用“ - >”用“this”和“[]”?

时间:2014-01-30 03:27:11

标签: c++ oop pointers

我正在玩组合,在我的一个类中,我有一个包含下标运算符“[]”(来自std :: vector)的包装器。但是,当我说this->[i]时,编译器(g ++)会生气。我使用(*this)[i]来解决这个问题,但我认为这些是同义词。我错过了什么?这是一个抛出错误的小示例代码(我故意避免newmethod中的迭代器只是为了简单地说明我的问题。)

#include <vector>
#include <iostream>

class A {
  private:
    std::vector<int> rep;
  public:
    std::size_t size() { return rep.size(); }
    int& operator[](std::size_t index) { return rep[index]; }
    void newmethod();

    A(size_t n, int m) : rep(n,m) {}
};

void A::newmethod() {
  for (std::size_t i=0; i < (this->size()); ++i) {
    std::cout << (*this)[i] << " ";
  }
  for (std::size_t i=0; i < (this->size()); ++i) {
    std::cout << this->[i]; << " "; //Causes an error!
  }
  return;
}

int main() {
  A(17,3).newmethod();
  return 0;
}

3 个答案:

答案 0 :(得分:7)

您必须直接调用operator[]成员函数,例如:

this->operator[](i)

答案 1 :(得分:2)

a->b相当于(*a).b。当您说a->[b]并将其转换为(*a).[b]时,您期望发生什么?

答案 2 :(得分:2)

这是不正确的,如果我们查看draft C++ standard,我们可以看到E1->E2等同于(*(E1)).E2而不是(*E1)E2,这将在{{{3}}部分中介绍1}} 类成员访问段落 2

  

[...]表达式E1-> E2转换为等效形式(*(E1))。E2; [...]

所以5.2.5后面的内容必须是类的成员(或基类),所以在这种情况下->

operator[]