我有A级和B级。
A类有一些字段。 B类就像:
class B {
public:
A* operator[]( int id ) {
return m_field.at( id );
}
/* also tried this one, but there are the same errors
A*& operator[]( int id ) {
return m_field.at( id );
}
*/
private:
vector<A*> m_field;
};
为什么我在执行时遇到错误:
B* B_instance = new B();
B_instance[some_int]->some_field_from_A;
错误是:
错误C2819:类型'B'没有重载成员'运算符 - &gt;'
错误C2039:'some_field_from_A':不是'B'的成员
为什么我需要 - &gt;运算符重载以及它应该是什么样子?这对我没有意义。
我正在使用Visual Studio 2012。
答案 0 :(得分:4)
索引运算符适用于B
类型的某些内容,而不适用于B *
类型的内容。因此,要使用索引运算符,首先需要取消引用指针(或者根本不使用指针):
(*B_instance)[some_int]...
错误的原因是因为指针可以被索引,因为它们能够表示数组,如下例所示:
int arr[2] = {0, 1};
int *p = arr; //array to pointer conversion
p[1] = 2; // now arr is {0, 2}
因此,当您索引B *
时,它会返回一个B
,它最有可能超出您想象的数组的范围。然后,当它需要点运算符时,在B
对象上使用箭头运算符。无论哪种方式,如果你使用指针,取消引用它,然后索引它,然后使用箭头。