我正在玩组合,在我的一个类中,我有一个包含下标运算符“[]”(来自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;
}
答案 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[]